diff --git a/BUILD.gn b/BUILD.gn
index 5f7f401..f0c7533 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -850,8 +850,8 @@
     # https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/reference.md#actions-and-copies
     data_deps = [
       "//chrome:xdg_mime",
-      "//mojo/edk:mojo_core_arc32",
-      "//mojo/edk:mojo_core_arc64",
+      "//mojo/core:shared_library_arc32",
+      "//mojo/core:shared_library_arc64",
     ]
 
     # TODO(bpastene): Figure out what's generating resources/chromeos/ and
diff --git a/DEPS b/DEPS
index 8f80a4f..a114032f 100644
--- a/DEPS
+++ b/DEPS
@@ -105,11 +105,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'cdefa23a23cfc411fb50a21d9a06bfaa8d037886',
+  'skia_revision': 'e72c144af687830af85f6d8546a61475a3c1fb9f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'fe51067f43e7208d06977d5036726360a4539d7b',
+  'v8_revision': '4a1379f94c23d6366b27ba643d8dc56c3baec413',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -117,7 +117,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': '2b06054dd41f3c26d656f4ed7043a90e1f934f07',
+  'angle_revision': 'bf6dc37972c50c371ebd144fabdcfd8ee37e8496',
   # 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.
@@ -129,7 +129,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '94f7b75b4d5d1988e599ed4a9a7b6cf451994f1d',
+  'pdfium_revision': 'd774a73b59ac36d533064041196d051c032eee6b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -913,7 +913,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '24b373394918979fdaabb1480fc65a3dd41113a0',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'd91316e9576a7baa1eed77caadcecca3edbe2793',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1035,7 +1035,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'a5c263cc63ffc2cc189b5214074c8792067c1853',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '57900cb93360989624d0b165baab2f08ebebb92e',
+    Var('webrtc_git') + '/src.git' + '@' + 'f4aeb891b7aa34f53a412559c244b468757bbd56',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index bcd9355..ac56057 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1643,7 +1643,7 @@
     "//content/public/browser",
     "//content/test:test_support",
     "//device/bluetooth",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net",
     "//skia",
     "//testing/gtest",
@@ -2001,7 +2001,7 @@
     "//components/user_manager",
     "//components/user_manager:test_support",
     "//device/bluetooth",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net:net",
     "//services/ui/public/cpp/input_devices:test_support",
     "//services/ui/public/interfaces",
@@ -2075,7 +2075,7 @@
     "//ash/public/cpp",
     "//base/test:test_support",
     "//cc/base",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//testing/gtest",
     "//testing/perf",
     "//ui/aura",
diff --git a/ash/accelerators/DEPS b/ash/accelerators/DEPS
index 0d82215..2f46d168 100644
--- a/ash/accelerators/DEPS
+++ b/ash/accelerators/DEPS
@@ -3,6 +3,6 @@
     "+ash/host"
   ],
   "accelerator_interactive_uitest_chromeos\.cc": [
-    "+mojo/edk/embedder/embedder.h"
+    "+mojo/core/embedder/embedder.h"
   ],
 }
diff --git a/ash/accelerators/accelerator_controller.cc b/ash/accelerators/accelerator_controller.cc
index 6118f25..cf79e6d 100644
--- a/ash/accelerators/accelerator_controller.cc
+++ b/ash/accelerators/accelerator_controller.cc
@@ -314,7 +314,7 @@
   // http://crbug.com/638269
   auto* keyboard_controller = keyboard::KeyboardController::Get();
   return !(keyboard_controller->enabled() &&
-           keyboard_controller->keyboard_visible());
+           keyboard_controller->IsKeyboardVisible());
 }
 
 void HandleNextIme() {
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn
index 9aa22d3..51be4a9 100644
--- a/ash/app_list/BUILD.gn
+++ b/ash/app_list/BUILD.gn
@@ -213,7 +213,7 @@
     "//ash/public/cpp/app_list/vector_icons",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//skia",
     "//testing/gtest",
     "//ui/accessibility",
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc
index fba6764..46bb29a2 100644
--- a/ash/app_list/app_list_presenter_delegate_unittest.cc
+++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -706,7 +706,7 @@
       keyboard::KeyboardBoundsFromRootBounds(
           Shell::GetPrimaryRootWindow()->bounds(), 100));
   keyboard_controller->NotifyKeyboardWindowLoaded();
-  EXPECT_TRUE(keyboard_controller->keyboard_visible());
+  EXPECT_TRUE(keyboard_controller->IsKeyboardVisible());
 
   // Tap or click outside the searchbox, the virtual keyboard should hide.
   if (test_click) {
@@ -716,7 +716,7 @@
   } else {
     generator->GestureTapAt(GetPointOutsideSearchbox());
   }
-  EXPECT_FALSE(keyboard_controller->keyboard_visible());
+  EXPECT_FALSE(keyboard_controller->IsKeyboardVisible());
 
   // The searchbox should still be active and the AppListView should still be in
   // FULLSCREEN_SEARCH.
diff --git a/ash/app_list/test/DEPS b/ash/app_list/test/DEPS
index 07617a9a..333f2a7 100644
--- a/ash/app_list/test/DEPS
+++ b/ash/app_list/test/DEPS
@@ -4,6 +4,6 @@
 
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ]
 }
diff --git a/ash/app_list/test/run_all_unittests.cc b/ash/app_list/test/run_all_unittests.cc
index 9099e2f..f38da10 100644
--- a/ash/app_list/test/run_all_unittests.cc
+++ b/ash/app_list/test/run_all_unittests.cc
@@ -11,7 +11,7 @@
 #include "base/test/test_discardable_memory_allocator.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/env.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -64,7 +64,7 @@
 int main(int argc, char** argv) {
   AppListTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(
       argc, argv,
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc
index 2c9676d..ab240f4 100644
--- a/ash/app_list/views/app_list_view.cc
+++ b/ash/app_list/views/app_list_view.cc
@@ -524,7 +524,7 @@
   // If the virtual keyboard is visible, dismiss the keyboard and return early.
   auto* const keyboard_controller = keyboard::KeyboardController::Get();
   if (keyboard_controller->enabled() &&
-      keyboard_controller->keyboard_visible()) {
+      keyboard_controller->IsKeyboardVisible()) {
     keyboard_controller->HideKeyboardByUser();
     return;
   }
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index 5fa1c2a..eaaa655 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -1376,9 +1376,10 @@
       to_update_auth = LoginAuthUserView::AUTH_PASSWORD;
       keyboard::KeyboardController* keyboard_controller =
           GetKeyboardController();
-      const bool keyboard_visible =
-          keyboard_controller ? keyboard_controller->keyboard_visible() : false;
-      if (state->show_pin && !keyboard_visible &&
+      const bool IsKeyboardVisible =
+          keyboard_controller ? keyboard_controller->IsKeyboardVisible()
+                              : false;
+      if (state->show_pin && !IsKeyboardVisible &&
           state->fingerprint_state ==
               mojom::FingerprintUnlockState::UNAVAILABLE) {
         to_update_auth |= LoginAuthUserView::AUTH_PIN;
diff --git a/ash/login/ui/login_keyboard_test_base.cc b/ash/login/ui/login_keyboard_test_base.cc
index c698a87..2ab29e3 100644
--- a/ash/login/ui/login_keyboard_test_base.cc
+++ b/ash/login/ui/login_keyboard_test_base.cc
@@ -58,12 +58,12 @@
             Shell::GetPrimaryRootWindow()->bounds(), height));
     keyboard_controller_->NotifyKeyboardWindowLoaded();
   }
-  ASSERT_TRUE(keyboard_controller_->keyboard_visible());
+  ASSERT_TRUE(keyboard_controller_->IsKeyboardVisible());
 }
 
 void LoginKeyboardTestBase::HideKeyboard() {
   keyboard_controller_->HideKeyboardByUser();
-  ASSERT_FALSE(keyboard_controller_->keyboard_visible());
+  ASSERT_FALSE(keyboard_controller_->IsKeyboardVisible());
 }
 
 gfx::Rect LoginKeyboardTestBase::GetKeyboardBoundsInScreen() const {
diff --git a/ash/magnifier/magnification_controller.cc b/ash/magnifier/magnification_controller.cc
index cc2ecbf2..d0090103 100644
--- a/ash/magnifier/magnification_controller.cc
+++ b/ash/magnifier/magnification_controller.cc
@@ -727,7 +727,7 @@
   bool reduce_bottom_margin = false;
   if (keyboard::KeyboardController::Get()->enabled()) {
     reduce_bottom_margin =
-        keyboard::KeyboardController::Get()->keyboard_visible();
+        keyboard::KeyboardController::Get()->IsKeyboardVisible();
   }
 
   MoveMagnifierWindowFollowPoint(mouse, margin, margin, margin, margin,
diff --git a/ash/system/ime_menu/ime_menu_tray.cc b/ash/system/ime_menu/ime_menu_tray.cc
index e19e5d5d..0850178 100644
--- a/ash/system/ime_menu/ime_menu_tray.cc
+++ b/ash/system/ime_menu/ime_menu_tray.cc
@@ -443,7 +443,7 @@
 void ImeMenuTray::ShowBubble(bool show_by_click) {
   auto* keyboard_controller = keyboard::KeyboardController::Get();
   if (keyboard_controller->enabled() &&
-      keyboard_controller->keyboard_visible()) {
+      keyboard_controller->IsKeyboardVisible()) {
     show_bubble_after_keyboard_hidden_ = true;
     keyboard_controller->AddObserver(this);
     keyboard_controller->HideKeyboardExplicitlyBySystem();
diff --git a/ash/test/DEPS b/ash/test/DEPS
index 1e2fa21..49bca20 100644
--- a/ash/test/DEPS
+++ b/ash/test/DEPS
@@ -2,7 +2,7 @@
   # In general files in this directory should not depend upon content.
   "+cc/test",
   "+components/viz/test",
-  "+mojo/edk",
+  "+mojo/core/embedder",
 ]
 
 specific_include_rules = {
diff --git a/ash/test/ash_interactive_ui_test_base.cc b/ash/test/ash_interactive_ui_test_base.cc
index 3fb9e511..a8b6ca99 100644
--- a/ash/test/ash_interactive_ui_test_base.cc
+++ b/ash/test/ash_interactive_ui_test_base.cc
@@ -6,7 +6,7 @@
 
 #include "base/lazy_instance.h"
 #include "base/path_service.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/aura/env.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
@@ -18,7 +18,7 @@
 
 class MojoInitializer {
  public:
-  MojoInitializer() { mojo::edk::Init(); }
+  MojoInitializer() { mojo::core::Init(); }
 };
 
 base::LazyInstance<MojoInitializer>::Leaky mojo_initializer;
diff --git a/ash/test/ash_perftests.cc b/ash/test/ash_perftests.cc
index 2bee2a0..2ecc24c 100644
--- a/ash/test/ash_perftests.cc
+++ b/ash/test/ash_perftests.cc
@@ -6,7 +6,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/test/launcher/unit_test_launcher.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/gl/gl_switches.h"
 
 namespace {
@@ -24,7 +24,7 @@
 int main(int argc, char** argv) {
   ash::AshTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
   return base::LaunchUnitTestsSerially(
       argc, argv, base::Bind(&RunHelper, base::Unretained(&test_suite)));
 }
diff --git a/ash/test/ash_unittests.cc b/ash/test/ash_unittests.cc
index 4f7557b..e2a413e3 100644
--- a/ash/test/ash_unittests.cc
+++ b/ash/test/ash_unittests.cc
@@ -5,12 +5,12 @@
 #include "ash/test/ash_test_suite.h"
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   ash::AshTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
   return base::LaunchUnitTests(
       argc, argv,
       base::Bind(&ash::AshTestSuite::Run, base::Unretained(&test_suite)));
diff --git a/ash/wm/lock_action_handler_layout_manager_unittest.cc b/ash/wm/lock_action_handler_layout_manager_unittest.cc
index 66d26d855..ad73abb 100644
--- a/ash/wm/lock_action_handler_layout_manager_unittest.cc
+++ b/ash/wm/lock_action_handler_layout_manager_unittest.cc
@@ -125,7 +125,7 @@
   void ShowKeyboard(bool show) {
     auto* keyboard = keyboard::KeyboardController::Get();
     ASSERT_TRUE(keyboard->enabled());
-    if (show == keyboard->keyboard_visible())
+    if (show == keyboard->IsKeyboardVisible())
       return;
 
     if (show) {
@@ -138,7 +138,7 @@
       keyboard->HideKeyboardByUser();
     }
 
-    DCHECK_EQ(show, keyboard->keyboard_visible());
+    DCHECK_EQ(show, keyboard->IsKeyboardVisible());
   }
 
   void SetUpTrayActionClientAndLockSession(mojom::TrayActionState state) {
diff --git a/ash/wm/lock_layout_manager_unittest.cc b/ash/wm/lock_layout_manager_unittest.cc
index 7f642781..2160db9 100644
--- a/ash/wm/lock_layout_manager_unittest.cc
+++ b/ash/wm/lock_layout_manager_unittest.cc
@@ -86,7 +86,7 @@
   void ShowKeyboard(bool show) {
     auto* keyboard = keyboard::KeyboardController::Get();
     ASSERT_TRUE(keyboard->enabled());
-    if (show == keyboard->keyboard_visible())
+    if (show == keyboard->IsKeyboardVisible())
       return;
 
     if (show) {
@@ -102,7 +102,7 @@
       keyboard->HideKeyboardByUser();
     }
 
-    DCHECK_EQ(show, keyboard->keyboard_visible());
+    DCHECK_EQ(show, keyboard->IsKeyboardVisible());
   }
 };
 
diff --git a/ash/wm/system_modal_container_layout_manager_unittest.cc b/ash/wm/system_modal_container_layout_manager_unittest.cc
index 94f1ac7..0d2bbb0c 100644
--- a/ash/wm/system_modal_container_layout_manager_unittest.cc
+++ b/ash/wm/system_modal_container_layout_manager_unittest.cc
@@ -179,7 +179,7 @@
   void ShowKeyboard(bool show) {
     auto* keyboard = keyboard::KeyboardController::Get();
     ASSERT_TRUE(keyboard->enabled());
-    if (show == keyboard->keyboard_visible())
+    if (show == keyboard->IsKeyboardVisible())
       return;
 
     if (show) {
@@ -194,7 +194,7 @@
       keyboard->HideKeyboardByUser();
     }
 
-    DCHECK_EQ(show, keyboard->keyboard_visible());
+    DCHECK_EQ(show, keyboard->IsKeyboardVisible());
   }
 };
 
diff --git a/base/memory/ref_counted_unittest.cc b/base/memory/ref_counted_unittest.cc
index d88fc540..df1c30f 100644
--- a/base/memory/ref_counted_unittest.cc
+++ b/base/memory/ref_counted_unittest.cc
@@ -154,6 +154,25 @@
   ~InitialRefCountIsOne() = default;
 };
 
+// Checks that the scoped_refptr is null before the reference counted object is
+// destroyed.
+class CheckRefptrNull : public base::RefCounted<CheckRefptrNull> {
+ public:
+  // Set the last scoped_refptr that will have a reference to this object.
+  void set_scoped_refptr(scoped_refptr<CheckRefptrNull>* ptr) { ptr_ = ptr; }
+
+ protected:
+  virtual ~CheckRefptrNull() {
+    EXPECT_NE(ptr_, nullptr);
+    EXPECT_EQ(ptr_->get(), nullptr);
+  }
+
+ private:
+  friend class base::RefCounted<CheckRefptrNull>;
+
+  scoped_refptr<CheckRefptrNull>* ptr_ = nullptr;
+};
+
 }  // end namespace
 
 TEST(RefCountedUnitTest, TestSelfAssignment) {
@@ -559,27 +578,80 @@
 TEST(RefCountedUnitTest, TestMakeRefCounted) {
   scoped_refptr<Derived> derived = new Derived;
   EXPECT_TRUE(derived->HasOneRef());
-  derived = nullptr;
+  derived.reset();
 
   scoped_refptr<Derived> derived2 = base::MakeRefCounted<Derived>();
   EXPECT_TRUE(derived2->HasOneRef());
-  derived2 = nullptr;
+  derived2.reset();
 }
 
 TEST(RefCountedUnitTest, TestInitialRefCountIsOne) {
   scoped_refptr<InitialRefCountIsOne> obj =
       base::MakeRefCounted<InitialRefCountIsOne>();
   EXPECT_TRUE(obj->HasOneRef());
-  obj = nullptr;
+  obj.reset();
 
   scoped_refptr<InitialRefCountIsOne> obj2 =
       base::AdoptRef(new InitialRefCountIsOne);
   EXPECT_TRUE(obj2->HasOneRef());
-  obj2 = nullptr;
+  obj2.reset();
 
   scoped_refptr<Other> obj3 = base::MakeRefCounted<Other>();
   EXPECT_TRUE(obj3->HasOneRef());
-  obj3 = nullptr;
+  obj3.reset();
+}
+
+TEST(RefCountedUnitTest, TestPrivateDestructorWithDeleter) {
+  // Ensure that RefCounted doesn't need the access to the pointee dtor when
+  // a custom deleter is given.
+  scoped_refptr<HasPrivateDestructorWithDeleter> obj =
+      base::MakeRefCounted<HasPrivateDestructorWithDeleter>();
+}
+
+TEST(RefCountedUnitTest, TestReset) {
+  ScopedRefPtrCountBase::reset_count();
+
+  // Create ScopedRefPtrCountBase that is referenced by |obj1| and |obj2|.
+  scoped_refptr<ScopedRefPtrCountBase> obj1 =
+      base::MakeRefCounted<ScopedRefPtrCountBase>();
+  scoped_refptr<ScopedRefPtrCountBase> obj2 = obj1;
+  EXPECT_NE(obj1.get(), nullptr);
+  EXPECT_NE(obj2.get(), nullptr);
+  EXPECT_EQ(ScopedRefPtrCountBase::constructor_count(), 1);
+  EXPECT_EQ(ScopedRefPtrCountBase::destructor_count(), 0);
+
+  // Check that calling reset() on |obj1| resets it. |obj2| still has a
+  // reference to the ScopedRefPtrCountBase so it shouldn't be reset.
+  obj1.reset();
+  EXPECT_EQ(obj1.get(), nullptr);
+  EXPECT_EQ(ScopedRefPtrCountBase::constructor_count(), 1);
+  EXPECT_EQ(ScopedRefPtrCountBase::destructor_count(), 0);
+
+  // Check that calling reset() on |obj2| resets it and causes the deletion of
+  // the ScopedRefPtrCountBase.
+  obj2.reset();
+  EXPECT_EQ(obj2.get(), nullptr);
+  EXPECT_EQ(ScopedRefPtrCountBase::constructor_count(), 1);
+  EXPECT_EQ(ScopedRefPtrCountBase::destructor_count(), 1);
+}
+
+TEST(RefCountedUnitTest, TestResetAlreadyNull) {
+  // Check that calling reset() on a null scoped_refptr does nothing.
+  scoped_refptr<ScopedRefPtrCountBase> obj;
+  obj.reset();
+  // |obj| should still be null after calling reset().
+  EXPECT_EQ(obj.get(), nullptr);
+}
+
+TEST(RefCountedUnitTest, CheckScopedRefptrNullBeforeObjectDestruction) {
+  scoped_refptr<CheckRefptrNull> obj = base::MakeRefCounted<CheckRefptrNull>();
+  obj->set_scoped_refptr(&obj);
+
+  // Check that when reset() is called the scoped_refptr internal pointer is set
+  // to null before the reference counted object is destroyed. This check is
+  // done by the CheckRefptrNull destructor.
+  obj.reset();
+  EXPECT_EQ(obj.get(), nullptr);
 }
 
 TEST(RefCountedDeathTest, TestAdoptRef) {
@@ -597,10 +669,3 @@
       base::MakeRefCounted<InitialRefCountIsOne>();
   EXPECT_DCHECK_DEATH(base::AdoptRef(obj.get()));
 }
-
-TEST(RefCountedUnitTest, TestPrivateDestructorWithDeleter) {
-  // Ensure that RefCounted doesn't need the access to the pointee dtor when
-  // a custom deleter is given.
-  scoped_refptr<HasPrivateDestructorWithDeleter> obj =
-      base::MakeRefCounted<HasPrivateDestructorWithDeleter>();
-}
diff --git a/base/memory/scoped_refptr.h b/base/memory/scoped_refptr.h
index a257617..389d0cbf 100644
--- a/base/memory/scoped_refptr.h
+++ b/base/memory/scoped_refptr.h
@@ -123,7 +123,7 @@
 //   void some_other_function() {
 //     scoped_refptr<MyFoo> foo = MakeRefCounted<MyFoo>();
 //     ...
-//     foo = nullptr;  // explicitly releases |foo|
+//     foo.reset();  // explicitly releases |foo|
 //     ...
 //     if (foo)
 //       foo->Method(param);
@@ -228,6 +228,10 @@
     return *this;
   }
 
+  // Sets managed object to null and releases reference to the previous managed
+  // object, if it existed.
+  void reset() { scoped_refptr().swap(*this); }
+
   void swap(scoped_refptr& r) noexcept { std::swap(ptr_, r.ptr_); }
 
   explicit operator bool() const { return ptr_ != nullptr; }
diff --git a/base/message_loop/message_loop.cc b/base/message_loop/message_loop.cc
index bd0a568..f4cd32c 100644
--- a/base/message_loop/message_loop.cc
+++ b/base/message_loop/message_loop.cc
@@ -426,8 +426,15 @@
 }
 
 bool MessageLoop::DoDelayedWork(TimeTicks* next_delayed_work_time) {
-  if (!task_execution_allowed_ ||
-      !incoming_task_queue_->delayed_tasks().HasTasks()) {
+  if (!task_execution_allowed_) {
+    *next_delayed_work_time = TimeTicks();
+    // |scheduled_wakeup_| isn't used in nested loops that don't process
+    // application tasks.
+    DCHECK(scheduled_wakeup_.next_run_time.is_null());
+    return false;
+  }
+
+  if (!incoming_task_queue_->delayed_tasks().HasTasks()) {
     *next_delayed_work_time = TimeTicks();
 
     // It's possible to be woken up by a system event and have it cancel the
@@ -505,9 +512,14 @@
   bool need_high_res_timers = false;
 #endif
 
+  // Do not report idle metrics nor do any logic related to delayed tasks if
+  // about to quit the loop and/or in a nested loop where
+  // |!task_execution_allowed_|. In the former case, the loop isn't going to
+  // sleep and in the latter case DoDelayedWork() will not actually do the work
+  // this is prepping for.
   if (ShouldQuitWhenIdle()) {
     pump_->Quit();
-  } else {
+  } else if (task_execution_allowed_) {
     incoming_task_queue_->ReportMetricsOnIdle();
 
     if (incoming_task_queue_->delayed_tasks().HasTasks()) {
diff --git a/base/message_loop/message_pump_win.cc b/base/message_loop/message_pump_win.cc
index 2860539a..76747a5 100644
--- a/base/message_loop/message_pump_win.cc
+++ b/base/message_loop/message_pump_win.cc
@@ -347,7 +347,7 @@
 }
 
 bool MessagePumpForUI::ProcessMessageHelper(const MSG& msg) {
-  TRACE_EVENT1("base", "MessagePumpForUI::ProcessMessageHelper",
+  TRACE_EVENT1("base,toplevel", "MessagePumpForUI::ProcessMessageHelper",
                "message", msg.message);
   if (WM_QUIT == msg.message) {
     // WM_QUIT is the standard way to exit a GetMessage() loop. Our MessageLoop
diff --git a/base/profiler/stack_sampling_profiler.cc b/base/profiler/stack_sampling_profiler.cc
index fcd6ace..02df814f 100644
--- a/base/profiler/stack_sampling_profiler.cc
+++ b/base/profiler/stack_sampling_profiler.cc
@@ -39,22 +39,6 @@
 // for referencing the active collection to the SamplingThread.
 const int kNullProfilerId = -1;
 
-void ChangeAtomicFlags(subtle::Atomic32* flags,
-                       subtle::Atomic32 set,
-                       subtle::Atomic32 clear) {
-  DCHECK(set != 0 || clear != 0);
-  DCHECK_EQ(0, set & clear);
-
-  subtle::Atomic32 bits = subtle::NoBarrier_Load(flags);
-  while (true) {
-    subtle::Atomic32 existing =
-        subtle::NoBarrier_CompareAndSwap(flags, bits, (bits | set) & ~clear);
-    if (existing == bits)
-      break;
-    bits = existing;
-  }
-}
-
 }  // namespace
 
 // StackSamplingProfiler::Module ----------------------------------------------
@@ -682,12 +666,6 @@
 // static
 void StackSamplingProfiler::TestAPI::Reset() {
   SamplingThread::TestAPI::Reset();
-  ResetAnnotations();
-}
-
-// static
-void StackSamplingProfiler::TestAPI::ResetAnnotations() {
-  subtle::NoBarrier_Store(&process_milestones_, 0u);
 }
 
 // static
@@ -706,8 +684,6 @@
   SamplingThread::TestAPI::ShutdownAssumingIdle(simulate_intervening_start);
 }
 
-subtle::Atomic32 StackSamplingProfiler::process_milestones_ = 0;
-
 StackSamplingProfiler::StackSamplingProfiler(
     const SamplingParams& params,
     std::unique_ptr<ProfileBuilder> profile_builder,
@@ -789,19 +765,6 @@
   profiler_id_ = kNullProfilerId;
 }
 
-// static
-void StackSamplingProfiler::SetProcessMilestone(int milestone) {
-  DCHECK_LE(0, milestone);
-  DCHECK_GT(static_cast<int>(sizeof(process_milestones_) * 8), milestone);
-  DCHECK_EQ(0, subtle::NoBarrier_Load(&process_milestones_) & (1 << milestone));
-  ChangeAtomicFlags(&process_milestones_, 1 << milestone, 0);
-}
-
-// static
-subtle::Atomic32 StackSamplingProfiler::ProcessMilestone() {
-  return subtle::NoBarrier_Load(&process_milestones_);
-}
-
 // StackSamplingProfiler::Frame global functions ------------------------------
 
 bool operator==(const StackSamplingProfiler::Module& a,
diff --git a/base/profiler/stack_sampling_profiler.h b/base/profiler/stack_sampling_profiler.h
index 864f0e9..e43349a8 100644
--- a/base/profiler/stack_sampling_profiler.h
+++ b/base/profiler/stack_sampling_profiler.h
@@ -12,7 +12,6 @@
 #include <string>
 #include <vector>
 
-#include "base/atomicops.h"
 #include "base/base_export.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
@@ -217,9 +216,6 @@
     // so that tests don't inherit state from previous tests.
     static void Reset();
 
-    // Resets internal annotations (like process phase) to initial values.
-    static void ResetAnnotations();
-
     // Returns whether the sampling thread is currently running or not.
     static bool IsSamplingThreadRunning();
 
@@ -306,18 +302,6 @@
   // are completed or the profiler object is destroyed, whichever occurs first.
   void Stop();
 
-  // Sets the current system state that is recorded with each captured stack
-  // frame. This is thread-safe so can be called from anywhere. The parameter
-  // value should be from an enumeration of the appropriate type with values
-  // ranging from 0 to 31, inclusive. This sets bits within Sample field of
-  // |process_milestones|. The actual meanings of these bits are defined
-  // (globally) by the caller(s).
-  static void SetProcessMilestone(int milestone);
-
-  // Gets the current system state that is recorded with each captured stack
-  // frame. This is thread-safe so can be called from anywhere.
-  static subtle::Atomic32 ProcessMilestone();
-
  private:
   friend class TestAPI;
 
@@ -325,13 +309,6 @@
   // the target thread.
   class SamplingThread;
 
-  // This global variables holds the current system state and is recorded with
-  // every captured sample, done on a separate thread which is why updates to
-  // this must be atomic. A PostTask to move the the updates to that thread
-  // would skew the timing and a lock could result in deadlock if the thread
-  // making a change was also being profiled and got stopped.
-  static subtle::Atomic32 process_milestones_;
-
   // The thread whose stack will be sampled.
   PlatformThreadId thread_id_;
 
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc
index 70c19a4..0de2154 100644
--- a/base/task/sequence_manager/sequence_manager_impl.cc
+++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -12,6 +12,7 @@
 #include "base/compiler_specific.h"
 #include "base/debug/crash_logging.h"
 #include "base/memory/ptr_util.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
 #include "base/task/sequence_manager/real_time_domain.h"
 #include "base/task/sequence_manager/task_time_observer.h"
@@ -339,6 +340,10 @@
     // right observers.
     main_thread_only().task_execution_stack.emplace_back(
         work_queue->TakeTaskFromWorkQueue(), work_queue->task_queue());
+
+    UMA_HISTOGRAM_COUNTS_1000("TaskQueueManager.ActiveQueuesCount",
+                              main_thread_only().active_queues.size());
+
     ExecutingTask& executing_task =
         *main_thread_only().task_execution_stack.rbegin();
     NotifyWillProcessTask(&executing_task, &lazy_now);
diff --git a/base/threading/thread_restrictions.h b/base/threading/thread_restrictions.h
index ae20f28..23b4382 100644
--- a/base/threading/thread_restrictions.h
+++ b/base/threading/thread_restrictions.h
@@ -85,7 +85,7 @@
 namespace mojo {
 class CoreLibraryInitializer;
 class SyncCallRestrictions;
-namespace edk {
+namespace core {
 class ScopedIPCSupport;
 }
 }
@@ -295,6 +295,7 @@
   friend class functions::ExecScriptScopedAllowBaseSyncPrimitives;
   friend class leveldb::LevelDBMojoProxy;
   friend class media::BlockingUrlProtocol;
+  friend class mojo::core::ScopedIPCSupport;
   friend class net::MultiThreadedCertVerifierScopedAllowBaseSyncPrimitives;
   friend class rlz_lib::FinancialPing;
   friend class shell_integration::LaunchXdgUtilityScopedAllowBaseSyncPrimitives;
@@ -446,7 +447,6 @@
   friend class PlatformThread;
   friend class android::JavaHandlerThread;
   friend class mojo::SyncCallRestrictions;
-  friend class mojo::edk::ScopedIPCSupport;
   friend class ui::CommandBufferClientImpl;
   friend class ui::CommandBufferLocal;
   friend class ui::GpuState;
diff --git a/base/timer/timer.h b/base/timer/timer.h
index 63bba92..4471067 100644
--- a/base/timer/timer.h
+++ b/base/timer/timer.h
@@ -250,6 +250,16 @@
   RepeatingTimer() : RepeatingTimer(nullptr) {}
   explicit RepeatingTimer(const TickClock* tick_clock)
       : Timer(true, true, tick_clock) {}
+
+  RepeatingTimer(const Location& posted_from,
+                 TimeDelta delay,
+                 RepeatingClosure user_task)
+      : Timer(posted_from, delay, std::move(user_task), true) {}
+  RepeatingTimer(const Location& posted_from,
+                 TimeDelta delay,
+                 RepeatingClosure user_task,
+                 const TickClock* tick_clock)
+      : Timer(posted_from, delay, std::move(user_task), true, tick_clock) {}
 };
 
 //-----------------------------------------------------------------------------
@@ -260,6 +270,16 @@
   RetainingOneShotTimer() : RetainingOneShotTimer(nullptr) {}
   explicit RetainingOneShotTimer(const TickClock* tick_clock)
       : Timer(true, false, tick_clock) {}
+
+  RetainingOneShotTimer(const Location& posted_from,
+                        TimeDelta delay,
+                        RepeatingClosure user_task)
+      : Timer(posted_from, delay, std::move(user_task), false) {}
+  RetainingOneShotTimer(const Location& posted_from,
+                        TimeDelta delay,
+                        RepeatingClosure user_task,
+                        const TickClock* tick_clock)
+      : Timer(posted_from, delay, std::move(user_task), false, tick_clock) {}
 };
 
 //-----------------------------------------------------------------------------
diff --git a/build/check_gn_headers_whitelist.txt b/build/check_gn_headers_whitelist.txt
index 87a50cd..d570a03f 100644
--- a/build/check_gn_headers_whitelist.txt
+++ b/build/check_gn_headers_whitelist.txt
@@ -184,8 +184,8 @@
 media/formats/mpeg/mpeg1_audio_stream_parser.h
 media/formats/mpeg/mpeg_audio_stream_parser_base.h
 media/gpu/media_gpu_export.h
-mojo/edk/system/broker_messages.h
-mojo/edk/system/system_impl_export.h
+mojo/core/broker_messages.h
+mojo/core/system_impl_export.h
 mojo/public/cpp/bindings/strong_associated_binding_set.h
 mojo/public/cpp/bindings/tests/mojo_test_blink_export.h
 mojo/public/cpp/test_support/test_support.h
diff --git a/build/fuchsia/sdk.sha1 b/build/fuchsia/sdk.sha1
index feb113a7..b871733 100644
--- a/build/fuchsia/sdk.sha1
+++ b/build/fuchsia/sdk.sha1
@@ -1 +1 @@
-93a5062d943601e5464c83e8b3fab9b8c459b14c
\ No newline at end of file
+8666bfb59cc64071919263ff1df7711df4e24e60
\ No newline at end of file
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 87ac7fc..0c8f58c 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -740,7 +740,7 @@
     "//gpu/ipc:gl_in_process_context",
     "//gpu/skia_bindings",
     "//media",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//testing/gmock",
     "//testing/gtest",
@@ -792,7 +792,7 @@
     "//gpu/ipc:gl_in_process_context",
     "//gpu/ipc/common:struct_traits",
     "//media",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//services/viz/public/interfaces",
     "//skia",
diff --git a/cc/animation/animation.cc b/cc/animation/animation.cc
index 0225da9d..1c8e2f66c 100644
--- a/cc/animation/animation.cc
+++ b/cc/animation/animation.cc
@@ -205,30 +205,35 @@
       ->AddKeyframeModel(std::move(keyframe_model));
 }
 
-void Animation::RemoveKeyframeModelsForKeyframeEffect(
+void Animation::PauseKeyframeModelForKeyframeEffect(
+    int keyframe_model_id,
+    double time_offset,
     KeyframeEffectId keyframe_effect_id) {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
-  GetKeyframeEffectById(keyframe_effect_id)->RemoveKeyframeModels();
+  GetKeyframeEffectById(keyframe_effect_id)
+      ->PauseKeyframeModel(keyframe_model_id, time_offset);
 }
 
-void Animation::PauseKeyframeEffect(double time_offset,
-                                    KeyframeEffectId keyframe_effect_id) {
+void Animation::RemoveKeyframeModelForKeyframeEffect(
+    int keyframe_model_id,
+    KeyframeEffectId keyframe_effect_id) {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
   GetKeyframeEffectById(keyframe_effect_id)
-      ->Pause(base::TimeDelta::FromSecondsD(time_offset));
+      ->RemoveKeyframeModel(keyframe_model_id);
 }
 
-void Animation::AbortKeyframeEffect(KeyframeEffectId keyframe_effect_id) {
+void Animation::AbortKeyframeModelForKeyframeEffect(
+    int keyframe_model_id,
+    KeyframeEffectId keyframe_effect_id) {
   DCHECK(GetKeyframeEffectById(keyframe_effect_id));
-  GetKeyframeEffectById(keyframe_effect_id)->Abort();
+  GetKeyframeEffectById(keyframe_effect_id)
+      ->AbortKeyframeModel(keyframe_model_id);
 }
 
-void Animation::AbortKeyframeModelsWithProperty(
-    TargetProperty::Type target_property,
-    bool needs_completion) {
+void Animation::AbortKeyframeModels(TargetProperty::Type target_property,
+                                    bool needs_completion) {
   for (auto& keyframe_effect : keyframe_effects_)
-    keyframe_effect->AbortKeyframeModelsWithProperty(target_property,
-                                                     needs_completion);
+    keyframe_effect->AbortKeyframeModels(target_property, needs_completion);
 }
 
 void Animation::PushPropertiesTo(Animation* animation_impl) {
diff --git a/cc/animation/animation.h b/cc/animation/animation.h
index 98f5615..3d0491d 100644
--- a/cc/animation/animation.h
+++ b/cc/animation/animation.h
@@ -83,13 +83,16 @@
   void AddKeyframeModelForKeyframeEffect(
       std::unique_ptr<KeyframeModel> keyframe_model,
       KeyframeEffectId keyframe_effect_id);
-  void RemoveKeyframeModelsForKeyframeEffect(
+  void PauseKeyframeModelForKeyframeEffect(int keyframe_model_id,
+                                           double time_offset,
+                                           KeyframeEffectId keyframe_effect_id);
+  void RemoveKeyframeModelForKeyframeEffect(
+      int keyframe_model_id,
       KeyframeEffectId keyframe_effect_id);
-  void PauseKeyframeEffect(double time_offset,
-                           KeyframeEffectId keyframe_effect_id);
-  void AbortKeyframeEffect(KeyframeEffectId keyframe_effect_id);
-  void AbortKeyframeModelsWithProperty(TargetProperty::Type target_property,
-                                       bool needs_completion);
+  void AbortKeyframeModelForKeyframeEffect(int keyframe_model_id,
+                                           KeyframeEffectId keyframe_effect_id);
+  void AbortKeyframeModels(TargetProperty::Type target_property,
+                           bool needs_completion);
 
   virtual void PushPropertiesTo(Animation* animation_impl);
 
diff --git a/cc/animation/animation_unittest.cc b/cc/animation/animation_unittest.cc
index e741936..cb09ab0 100644
--- a/cc/animation/animation_unittest.cc
+++ b/cc/animation/animation_unittest.cc
@@ -367,6 +367,8 @@
   const float start_opacity = .7f;
   const float end_opacity = .3f;
 
+  const int filter_id = AddAnimatedFilterToAnimation(
+      animation_.get(), duration, 0.1f, 0.9f, keyframe_effect_id_);
   AddOpacityTransitionToAnimation(animation_.get(), duration, start_opacity,
                                   end_opacity, false, keyframe_effect_id_);
 
@@ -380,11 +382,18 @@
                    ->needs_push_properties());
   EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                    ->element_animations());
+  animation_->RemoveKeyframeModelForKeyframeEffect(filter_id,
+                                                   keyframe_effect_id_);
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
+                   ->needs_push_properties());
 
   animation_->AttachElementForKeyframeEffect(element_id_, keyframe_effect_id_);
 
   EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->element_animations());
+  EXPECT_FALSE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
+                   ->element_animations()
+                   ->HasAnyAnimationTargetingProperty(TargetProperty::FILTER));
   EXPECT_TRUE(animation_->GetKeyframeEffectById(keyframe_effect_id_)
                   ->element_animations()
                   ->HasAnyAnimationTargetingProperty(TargetProperty::OPACITY));
@@ -398,6 +407,11 @@
   EXPECT_FALSE(client_impl_.IsPropertyMutated(
       element_id_, ElementListType::ACTIVE, TargetProperty::OPACITY));
 
+  EXPECT_FALSE(client_.IsPropertyMutated(element_id_, ElementListType::ACTIVE,
+                                         TargetProperty::FILTER));
+  EXPECT_FALSE(client_impl_.IsPropertyMutated(
+      element_id_, ElementListType::ACTIVE, TargetProperty::FILTER));
+
   host_impl_->ActivateAnimations();
 
   base::TimeTicks time;
@@ -413,6 +427,11 @@
       element_id_, ElementListType::ACTIVE, end_opacity);
   client_impl_.ExpectOpacityPropertyMutated(
       element_id_, ElementListType::PENDING, end_opacity);
+
+  EXPECT_FALSE(client_.IsPropertyMutated(element_id_, ElementListType::ACTIVE,
+                                         TargetProperty::FILTER));
+  EXPECT_FALSE(client_impl_.IsPropertyMutated(
+      element_id_, ElementListType::ACTIVE, TargetProperty::FILTER));
 }
 
 TEST_F(AnimationTest, AddRemoveAnimationCausesSetNeedsCommit) {
@@ -427,17 +446,19 @@
 
   EXPECT_FALSE(client_.mutators_need_commit());
 
-  AddOpacityTransitionToAnimation(animation_.get(), 1., .7f, .3f, false,
-                                  keyframe_effect_id_);
+  const int keyframe_model_id = AddOpacityTransitionToAnimation(
+      animation_.get(), 1., .7f, .3f, false, keyframe_effect_id_);
 
   EXPECT_TRUE(client_.mutators_need_commit());
   client_.set_mutators_need_commit(false);
 
-  animation_->PauseKeyframeEffect(1., keyframe_effect_id_);
+  animation_->PauseKeyframeModelForKeyframeEffect(keyframe_model_id, 1.,
+                                                  keyframe_effect_id_);
   EXPECT_TRUE(client_.mutators_need_commit());
   client_.set_mutators_need_commit(false);
 
-  animation_->RemoveKeyframeModelsForKeyframeEffect(keyframe_effect_id_);
+  animation_->RemoveKeyframeModelForKeyframeEffect(keyframe_model_id,
+                                                   keyframe_effect_id_);
   EXPECT_TRUE(client_.mutators_need_commit());
   client_.set_mutators_need_commit(false);
 }
diff --git a/cc/animation/element_animations_unittest.cc b/cc/animation/element_animations_unittest.cc
index a656dbaf..9cff257 100644
--- a/cc/animation/element_animations_unittest.cc
+++ b/cc/animation/element_animations_unittest.cc
@@ -615,7 +615,7 @@
 
   // Pause the animation at the middle of the second range so the offset
   // delays animation until the middle of the third range.
-  animation_->PauseKeyframeEffect(1.5);
+  animation_->PauseKeyframeModel(keyframe_model_id, 1.5);
   EXPECT_EQ(KeyframeModel::PAUSED, animation_->keyframe_effect()
                                        ->GetKeyframeModelById(keyframe_model_id)
                                        ->run_state());
@@ -1103,8 +1103,7 @@
 
   auto events = CreateEventsForTesting();
 
-  // Removing keyframe models with target SCROLL_OFFSET leads to
-  // scroll_offset_animation_was_interrupted being set to true.
+  // First test the 1-argument version of RemoveKeyframeModel.
   gfx::ScrollOffset target_value(300.f, 200.f);
   std::unique_ptr<ScrollOffsetAnimationCurve> curve(
       ScrollOffsetAnimationCurve::Create(
@@ -1123,7 +1122,7 @@
   EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
-  animation_->RemoveKeyframeModels();
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_TRUE(
       animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
@@ -1137,7 +1136,36 @@
   EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
-  // Check that removing non-scroll-offset keyframe models does not cause
+  // Now, test the 2-argument version of RemoveKeyframeModel.
+  curve = ScrollOffsetAnimationCurve::Create(
+      target_value, CubicBezierTimingFunction::CreatePreset(
+                        CubicBezierTimingFunction::EaseType::EASE_IN_OUT));
+  keyframe_model = KeyframeModel::Create(std::move(curve), keyframe_model_id, 0,
+                                         TargetProperty::SCROLL_OFFSET);
+  keyframe_model->set_needs_synchronized_start_time(true);
+  animation_->AddKeyframeModel(std::move(keyframe_model));
+  PushProperties();
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_FALSE(
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
+                   ->scroll_offset_animation_was_interrupted());
+
+  animation_->RemoveKeyframeModel(keyframe_model_id);
+  EXPECT_TRUE(
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+
+  PushProperties();
+  EXPECT_TRUE(animation_impl_->keyframe_effect()
+                  ->scroll_offset_animation_was_interrupted());
+  EXPECT_FALSE(
+      animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
+
+  animation_impl_->ActivateKeyframeEffects();
+  EXPECT_FALSE(animation_impl_->keyframe_effect()
+                   ->scroll_offset_animation_was_interrupted());
+
+  // Check that removing non-scroll-offset animations does not cause
   // scroll_offset_animation_was_interrupted() to get set.
   keyframe_model_id =
       AddAnimatedTransformToAnimation(animation_.get(), 1.0, 1, 2);
@@ -1148,7 +1176,7 @@
   EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
-  animation_->RemoveKeyframeModels();
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_FALSE(
       animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
@@ -1171,7 +1199,7 @@
   EXPECT_FALSE(animation_impl_->keyframe_effect()
                    ->scroll_offset_animation_was_interrupted());
 
-  animation_->RemoveKeyframeModels();
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_FALSE(
       animation_->keyframe_effect()->scroll_offset_animation_was_interrupted());
 
@@ -1389,7 +1417,7 @@
   std::unique_ptr<KeyframeModel> to_add(CreateKeyframeModel(
       std::unique_ptr<AnimationCurve>(new FakeFloatTransition(1.0, 1.f, 0.5f)),
       2, TargetProperty::OPACITY));
-  animation_->AbortKeyframeModelsWithProperty(TargetProperty::OPACITY, false);
+  animation_->AbortKeyframeModels(TargetProperty::OPACITY, false);
   animation_->AddKeyframeModel(std::move(to_add));
 
   // Since the previous animation was aborted, the new animation should start
@@ -1802,9 +1830,9 @@
             client_impl_.GetOpacity(element_id_, ElementListType::ACTIVE));
 }
 
-// Tests that AbortKeyframeModelsWithProperty aborts all animations targeting
-// the specified property.
-TEST_F(ElementAnimationsTest, AbortKeyframeModelsWithProperty) {
+// Tests that AbortKeyframeModels aborts all animations targeting the
+// specified property.
+TEST_F(ElementAnimationsTest, AbortKeyframeModels) {
   CreateTestLayer(false, false);
   AttachTimelineAnimationLayer();
 
@@ -1847,7 +1875,7 @@
       KeyframeModel::RUNNING,
       animation_->keyframe_effect()->GetKeyframeModelById(5)->run_state());
 
-  animation_->AbortKeyframeModelsWithProperty(TargetProperty::TRANSFORM, false);
+  animation_->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
 
   // Only un-finished TRANSFORM animations should have been aborted.
   EXPECT_EQ(
@@ -1885,7 +1913,7 @@
       keyframe_model_id));
   EXPECT_FALSE(host_->needs_push_properties());
 
-  animation_->AbortKeyframeModelsWithProperty(TargetProperty::OPACITY, false);
+  animation_->AbortKeyframeModels(TargetProperty::OPACITY, false);
   EXPECT_EQ(KeyframeModel::ABORTED,
             animation_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
   EXPECT_TRUE(host_->needs_push_properties());
@@ -1927,8 +1955,7 @@
   EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
       keyframe_model_id));
 
-  animation_impl_->AbortKeyframeModelsWithProperty(TargetProperty::OPACITY,
-                                                   false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::OPACITY, false);
   EXPECT_EQ(
       KeyframeModel::ABORTED,
       animation_impl_->GetKeyframeModel(TargetProperty::OPACITY)->run_state());
@@ -1999,8 +2026,7 @@
   EXPECT_TRUE(animation_impl_->keyframe_effect()->GetKeyframeModelById(
       keyframe_model_id));
 
-  animation_impl_->AbortKeyframeModelsWithProperty(
-      TargetProperty::SCROLL_OFFSET, true);
+  animation_impl_->AbortKeyframeModels(TargetProperty::SCROLL_OFFSET, true);
   EXPECT_TRUE(host_impl_->needs_push_properties());
   EXPECT_EQ(KeyframeModel::ABORTED_BUT_NEEDS_COMPLETION,
             animation_impl_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET)
@@ -2126,8 +2152,7 @@
   EXPECT_EQ(AnimationEvent::STARTED, events->events_[0].type);
   EXPECT_EQ(AnimationEvent::STARTED, events->events_[1].type);
 
-  animation_impl_->AbortKeyframeModelsWithProperty(TargetProperty::OPACITY,
-                                                   false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::OPACITY, false);
 
   events = CreateEventsForTesting();
   animation_impl_->Tick(kInitialTickTime + TimeDelta::FromMilliseconds(1000));
@@ -2274,7 +2299,7 @@
   curve2->AddKeyframe(TransformKeyframe::Create(
       base::TimeDelta::FromSecondsD(1.0), operations3, nullptr));
 
-  animation_impl_->RemoveKeyframeModels();
+  animation_impl_->RemoveKeyframeModel(1);
   keyframe_model =
       KeyframeModel::Create(std::move(curve2), 2, 2, TargetProperty::TRANSFORM);
 
@@ -2799,7 +2824,8 @@
   animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  animation_->RemoveKeyframeModels();
+  animation_->RemoveKeyframeModel(keyframe_model_id);
+  animation_->RemoveKeyframeModel(animation2_id);
   EXPECT_FALSE(client_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_.GetTransformIsCurrentlyAnimating(
@@ -2851,8 +2877,7 @@
   animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  animation_impl_->AbortKeyframeModelsWithProperty(TargetProperty::TRANSFORM,
-                                                   false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
   EXPECT_FALSE(client_impl_.GetHasPotentialTransformAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_FALSE(client_impl_.GetTransformIsCurrentlyAnimating(
@@ -3014,7 +3039,7 @@
   animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  animation_->RemoveKeyframeModels();
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_FALSE(client_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::ACTIVE));
   EXPECT_FALSE(client_.GetOpacityIsCurrentlyAnimating(element_id_,
@@ -3066,8 +3091,7 @@
   animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  animation_impl_->AbortKeyframeModelsWithProperty(TargetProperty::OPACITY,
-                                                   false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::OPACITY, false);
   EXPECT_FALSE(client_impl_.GetHasPotentialOpacityAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_FALSE(client_impl_.GetOpacityIsCurrentlyAnimating(
@@ -3228,7 +3252,7 @@
   animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  animation_->RemoveKeyframeModels();
+  animation_->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_FALSE(client_.GetHasPotentialFilterAnimation(element_id_,
                                                       ElementListType::ACTIVE));
   EXPECT_FALSE(client_.GetFilterIsCurrentlyAnimating(element_id_,
@@ -3280,8 +3304,7 @@
   animation_->keyframe_effect()->NotifyKeyframeModelStarted(events->events_[0]);
   events->events_.clear();
 
-  animation_impl_->AbortKeyframeModelsWithProperty(TargetProperty::FILTER,
-                                                   false);
+  animation_impl_->AbortKeyframeModels(TargetProperty::FILTER, false);
   EXPECT_FALSE(client_impl_.GetHasPotentialFilterAnimation(
       element_id_, ElementListType::PENDING));
   EXPECT_FALSE(client_impl_.GetFilterIsCurrentlyAnimating(
@@ -3385,7 +3408,8 @@
                   ->affects_active_elements());
 
   // Delete the animation on the main-thread animations.
-  animation_->RemoveKeyframeModels();
+  animation_->RemoveKeyframeModel(
+      animation_->GetKeyframeModel(TargetProperty::OPACITY)->id());
   PushProperties();
 
   // The animation should no longer affect pending elements.
@@ -3444,7 +3468,8 @@
 
   // Remove the first animation from the main-thread animations, and add a
   // new animation affecting the same property.
-  animation_->RemoveKeyframeModels();
+  animation_->RemoveKeyframeModel(
+      animation_->GetKeyframeModel(TargetProperty::OPACITY)->id());
   const int second_keyframe_model_id =
       AddOpacityTransitionToAnimation(animation_.get(), 1, 1.f, 0.5f, true);
   PushProperties();
diff --git a/cc/animation/keyframe_effect.cc b/cc/animation/keyframe_effect.cc
index 28bf216..1cb72f2 100644
--- a/cc/animation/keyframe_effect.cc
+++ b/cc/animation/keyframe_effect.cc
@@ -233,8 +233,74 @@
   }
 }
 
-void KeyframeEffect::Abort() {
+void KeyframeEffect::AddKeyframeModel(
+    std::unique_ptr<KeyframeModel> keyframe_model) {
+  DCHECK(keyframe_model->target_property_id() !=
+             TargetProperty::SCROLL_OFFSET ||
+         (animation_->animation_host()->SupportsScrollAnimations()));
+  DCHECK(!keyframe_model->is_impl_only() ||
+         keyframe_model->target_property_id() == TargetProperty::SCROLL_OFFSET);
+
+  keyframe_models_.push_back(std::move(keyframe_model));
+
+  if (has_bound_element_animations()) {
+    KeyframeModelAdded();
+    SetNeedsPushProperties();
+  }
+}
+
+void KeyframeEffect::PauseKeyframeModel(int keyframe_model_id,
+                                        double time_offset) {
+  const base::TimeDelta time_delta = base::TimeDelta::FromSecondsD(time_offset);
   for (auto& keyframe_model : keyframe_models_) {
+    if (keyframe_model->id() == keyframe_model_id) {
+      keyframe_model->SetRunState(KeyframeModel::PAUSED,
+                                  time_delta + keyframe_model->start_time() +
+                                      keyframe_model->time_offset());
+    }
+  }
+
+  if (has_bound_element_animations()) {
+    animation_->SetNeedsCommit();
+    SetNeedsPushProperties();
+  }
+}
+
+void KeyframeEffect::RemoveKeyframeModel(int keyframe_model_id) {
+  bool keyframe_model_removed = false;
+
+  // Since we want to use the KeyframeModels that we're going to remove, we
+  // need to use a stable_parition here instead of remove_if. Remove_if leaves
+  // the removed items in an unspecified state.
+  auto keyframe_models_to_remove = std::stable_partition(
+      keyframe_models_.begin(), keyframe_models_.end(),
+      [keyframe_model_id](
+          const std::unique_ptr<KeyframeModel>& keyframe_model) {
+        return keyframe_model->id() != keyframe_model_id;
+      });
+  for (auto it = keyframe_models_to_remove; it != keyframe_models_.end();
+       ++it) {
+    if ((*it)->target_property_id() == TargetProperty::SCROLL_OFFSET) {
+      if (has_bound_element_animations())
+        scroll_offset_animation_was_interrupted_ = true;
+    } else if (!(*it)->is_finished()) {
+      keyframe_model_removed = true;
+    }
+  }
+
+  keyframe_models_.erase(keyframe_models_to_remove, keyframe_models_.end());
+
+  if (has_bound_element_animations()) {
+    UpdateTickingState(UpdateTickingType::NORMAL);
+    if (keyframe_model_removed)
+      element_animations_->UpdateClientAnimationState();
+    animation_->SetNeedsCommit();
+    SetNeedsPushProperties();
+  }
+}
+
+void KeyframeEffect::AbortKeyframeModel(int keyframe_model_id) {
+  if (KeyframeModel* keyframe_model = GetKeyframeModelById(keyframe_model_id)) {
     if (!keyframe_model->is_finished()) {
       keyframe_model->SetRunState(KeyframeModel::ABORTED, last_tick_time_);
       if (has_bound_element_animations())
@@ -248,9 +314,8 @@
   }
 }
 
-void KeyframeEffect::AbortKeyframeModelsWithProperty(
-    TargetProperty::Type target_property,
-    bool needs_completion) {
+void KeyframeEffect::AbortKeyframeModels(TargetProperty::Type target_property,
+                                         bool needs_completion) {
   if (needs_completion)
     DCHECK(target_property == TargetProperty::SCROLL_OFFSET);
 
@@ -278,46 +343,6 @@
   }
 }
 
-void KeyframeEffect::AddKeyframeModel(
-    std::unique_ptr<KeyframeModel> keyframe_model) {
-  AnimationHost* animation_host = animation_->animation_host();
-  DCHECK(keyframe_model->target_property_id() !=
-             TargetProperty::SCROLL_OFFSET ||
-         (animation_host && animation_host->SupportsScrollAnimations()));
-  DCHECK(!keyframe_model->is_impl_only() ||
-         keyframe_model->target_property_id() == TargetProperty::SCROLL_OFFSET);
-
-  keyframe_models_.push_back(std::move(keyframe_model));
-
-  if (has_bound_element_animations()) {
-    KeyframeModelAdded();
-    SetNeedsPushProperties();
-  }
-}
-
-void KeyframeEffect::RemoveKeyframeModels() {
-  bool keyframe_model_removed = false;
-
-  for (auto it = keyframe_models_.begin(); it != keyframe_models_.end(); ++it) {
-    if ((*it)->target_property_id() == TargetProperty::SCROLL_OFFSET) {
-      if (has_bound_element_animations())
-        scroll_offset_animation_was_interrupted_ = true;
-    } else if (!(*it)->is_finished()) {
-      keyframe_model_removed = true;
-    }
-  }
-
-  keyframe_models_.clear();
-
-  if (has_bound_element_animations()) {
-    UpdateTickingState(UpdateTickingType::NORMAL);
-    if (keyframe_model_removed)
-      element_animations_->UpdateClientAnimationState();
-    animation_->SetNeedsCommit();
-    SetNeedsPushProperties();
-  }
-}
-
 void KeyframeEffect::ActivateKeyframeEffects() {
   DCHECK(has_bound_element_animations());
 
diff --git a/cc/animation/keyframe_effect.h b/cc/animation/keyframe_effect.h
index 9550f5c4..7fec09f 100644
--- a/cc/animation/keyframe_effect.h
+++ b/cc/animation/keyframe_effect.h
@@ -91,12 +91,13 @@
   void UpdateTickingState(UpdateTickingType type);
 
   void Pause(base::TimeDelta pause_offset);
-  void Abort();
-  void AbortKeyframeModelsWithProperty(TargetProperty::Type target_property,
-                                       bool needs_completion);
 
   void AddKeyframeModel(std::unique_ptr<KeyframeModel> keyframe_model);
-  void RemoveKeyframeModels();
+  void PauseKeyframeModel(int keyframe_model_id, double time_offset);
+  void RemoveKeyframeModel(int keyframe_model_id);
+  void AbortKeyframeModel(int keyframe_model_id);
+  void AbortKeyframeModels(TargetProperty::Type target_property,
+                           bool needs_completion);
 
   void ActivateKeyframeEffects();
 
diff --git a/cc/animation/scroll_offset_animations_impl.cc b/cc/animation/scroll_offset_animations_impl.cc
index 2e1a274..7440a78 100644
--- a/cc/animation/scroll_offset_animations_impl.cc
+++ b/cc/animation/scroll_offset_animations_impl.cc
@@ -155,8 +155,8 @@
 
 void ScrollOffsetAnimationsImpl::ScrollAnimationAbort(bool needs_completion) {
   DCHECK(scroll_offset_animation_);
-  scroll_offset_animation_->AbortKeyframeModelsWithProperty(
-      TargetProperty::SCROLL_OFFSET, needs_completion);
+  scroll_offset_animation_->AbortKeyframeModels(TargetProperty::SCROLL_OFFSET,
+                                                needs_completion);
 }
 
 void ScrollOffsetAnimationsImpl::NotifyAnimationFinished(
diff --git a/cc/animation/single_keyframe_effect_animation.cc b/cc/animation/single_keyframe_effect_animation.cc
index c5163c30..4c5d3eb0 100644
--- a/cc/animation/single_keyframe_effect_animation.cc
+++ b/cc/animation/single_keyframe_effect_animation.cc
@@ -72,16 +72,20 @@
                                     GetKeyframeEffect()->id());
 }
 
-void SingleKeyframeEffectAnimation::RemoveKeyframeModels() {
-  RemoveKeyframeModelsForKeyframeEffect(GetKeyframeEffect()->id());
+void SingleKeyframeEffectAnimation::PauseKeyframeModel(int keyframe_model_id,
+                                                       double time_offset) {
+  PauseKeyframeModelForKeyframeEffect(keyframe_model_id, time_offset,
+                                      GetKeyframeEffect()->id());
 }
 
-void SingleKeyframeEffectAnimation::PauseKeyframeEffect(double time_offset) {
-  Animation::PauseKeyframeEffect(time_offset, GetKeyframeEffect()->id());
+void SingleKeyframeEffectAnimation::RemoveKeyframeModel(int keyframe_model_id) {
+  RemoveKeyframeModelForKeyframeEffect(keyframe_model_id,
+                                       GetKeyframeEffect()->id());
 }
 
-void SingleKeyframeEffectAnimation::AbortKeyframeEffect() {
-  Animation::AbortKeyframeEffect(GetKeyframeEffect()->id());
+void SingleKeyframeEffectAnimation::AbortKeyframeModel(int keyframe_model_id) {
+  AbortKeyframeModelForKeyframeEffect(keyframe_model_id,
+                                      GetKeyframeEffect()->id());
 }
 
 bool SingleKeyframeEffectAnimation::NotifyKeyframeModelFinishedForTesting(
diff --git a/cc/animation/single_keyframe_effect_animation.h b/cc/animation/single_keyframe_effect_animation.h
index c9abda89..1326bb185 100644
--- a/cc/animation/single_keyframe_effect_animation.h
+++ b/cc/animation/single_keyframe_effect_animation.h
@@ -43,9 +43,9 @@
 
   KeyframeEffect* keyframe_effect() const;
   void AddKeyframeModel(std::unique_ptr<KeyframeModel> keyframe_model);
-  virtual void RemoveKeyframeModels();
-  void PauseKeyframeEffect(double time_offset);
-  void AbortKeyframeEffect();
+  void PauseKeyframeModel(int keyframe_model_id, double time_offset);
+  virtual void RemoveKeyframeModel(int keyframe_model_id);
+  void AbortKeyframeModel(int keyframe_model_id);
 
   bool NotifyKeyframeModelFinishedForTesting(
       TargetProperty::Type target_property,
diff --git a/cc/animation/worklet_animation.cc b/cc/animation/worklet_animation.cc
index 4381586..9d4828c 100644
--- a/cc/animation/worklet_animation.cc
+++ b/cc/animation/worklet_animation.cc
@@ -155,9 +155,9 @@
     scroll_timeline_->PromoteScrollTimelinePendingToActive();
 }
 
-void WorkletAnimation::RemoveKeyframeModels() {
+void WorkletAnimation::RemoveKeyframeModel(int keyframe_model_id) {
   state_ = State::REMOVED;
-  SingleKeyframeEffectAnimation::RemoveKeyframeModels();
+  SingleKeyframeEffectAnimation::RemoveKeyframeModel(keyframe_model_id);
 }
 
 bool WorkletAnimation::IsWorkletAnimation() const {
diff --git a/cc/animation/worklet_animation.h b/cc/animation/worklet_animation.h
index d30771b..665fb3b2 100644
--- a/cc/animation/worklet_animation.h
+++ b/cc/animation/worklet_animation.h
@@ -64,7 +64,7 @@
   // require updating the ElementId for the ScrollTimeline scroll source.
   void PromoteScrollTimelinePendingToActive() override;
 
-  void RemoveKeyframeModels() override;
+  void RemoveKeyframeModel(int keyframe_model_id) override;
 
  private:
   ~WorkletAnimation() override;
diff --git a/cc/animation/worklet_animation_unittest.cc b/cc/animation/worklet_animation_unittest.cc
index 058deac1..656ef4f 100644
--- a/cc/animation/worklet_animation_unittest.cc
+++ b/cc/animation/worklet_animation_unittest.cc
@@ -208,8 +208,8 @@
   const float end_opacity = .3f;
   const double duration = 1.;
 
-  AddOpacityTransitionToAnimation(worklet_animation_.get(), duration,
-                                  start_opacity, end_opacity, true);
+  int keyframe_model_id = AddOpacityTransitionToAnimation(
+      worklet_animation_.get(), duration, start_opacity, end_opacity, true);
 
   ScrollTree scroll_tree;
   std::unique_ptr<MutatorEvents> events = host_->CreateEvents();
@@ -257,8 +257,8 @@
   EXPECT_EQ(input->removed_animations.size(), 0u);
 
   // WorkletAnimation sets state to REMOVED when JavaScript fires cancel() which
-  // leads to RemoveKeyframeModels.
-  worklet_animation_impl_->RemoveKeyframeModels();
+  // leads to RemoveKeyframeModel.
+  worklet_animation_impl_->RemoveKeyframeModel(keyframe_model_id);
   host_impl_->UpdateAnimationState(true, events.get());
   state.reset(new MutatorInputState());
   worklet_animation_impl_->UpdateInputState(state.get(), time, scroll_tree,
@@ -283,8 +283,8 @@
   const float end_opacity = .3f;
   const double duration = 1.;
 
-  AddOpacityTransitionToAnimation(worklet_animation_.get(), duration,
-                                  start_opacity, end_opacity, true);
+  int keyframe_model_id = AddOpacityTransitionToAnimation(
+      worklet_animation_.get(), duration, start_opacity, end_opacity, true);
 
   ScrollTree scroll_tree;
   std::unique_ptr<MutatorEvents> events = host_->CreateEvents();
@@ -320,7 +320,7 @@
   state.reset(new MutatorInputState());
   // Input state gets updated when the worklet animation is to be removed even
   // the input time doesn't change.
-  worklet_animation_impl_->RemoveKeyframeModels();
+  worklet_animation_impl_->RemoveKeyframeModel(keyframe_model_id);
   worklet_animation_impl_->UpdateInputState(state.get(), time, scroll_tree,
                                             true);
   input = state->TakeWorkletState(worklet_animation_id_.scope_id);
diff --git a/cc/input/snap_fling_controller.h b/cc/input/snap_fling_controller.h
index 5199b23f..20f3056 100644
--- a/cc/input/snap_fling_controller.h
+++ b/cc/input/snap_fling_controller.h
@@ -24,8 +24,8 @@
 class SnapFlingClient {
  public:
   virtual bool GetSnapFlingInfo(const gfx::Vector2dF& natural_displacement,
-                                gfx::Vector2dF* initial_offset,
-                                gfx::Vector2dF* target_offset) const = 0;
+                                gfx::Vector2dF* out_initial_offset,
+                                gfx::Vector2dF* out_target_offset) const = 0;
   virtual gfx::Vector2dF ScrollByForSnapFling(const gfx::Vector2dF& delta) = 0;
   virtual void ScrollEndForSnapFling() = 0;
   virtual void RequestAnimationForSnapFling() = 0;
diff --git a/cc/scheduler/compositor_timing_history.cc b/cc/scheduler/compositor_timing_history.cc
index d6fe934..cb6bcf5 100644
--- a/cc/scheduler/compositor_timing_history.cc
+++ b/cc/scheduler/compositor_timing_history.cc
@@ -291,10 +291,9 @@
         "Scheduling.Browser.BeginMainFrameIntervalNotCritical", interval);
   }
 
-  void AddCommitInterval(base::TimeDelta interval) override {
-    UMA_HISTOGRAM_CUSTOM_TIMES_VSYNC_ALIGNED(
-        "Scheduling.Browser.CommitInterval", interval);
-  }
+  // CommitInterval is not meaningful to measure on browser side because
+  // browser rendering fps is not at 60.
+  void AddCommitInterval(base::TimeDelta interval) override {}
 
   // DrawInterval is not meaningful to measure on browser side because
   // browser rendering fps is not at 60.
diff --git a/cc/test/DEPS b/cc/test/DEPS
index b542323..006cc4c6 100644
--- a/cc/test/DEPS
+++ b/cc/test/DEPS
@@ -17,7 +17,7 @@
 
 specific_include_rules = {
   "run_all_(perf|unit)tests\.cc": [
-    "+mojo/edk/embedder/embedder.h",
+    "+mojo/core/embedder/embedder.h",
   ],
   "cc_test_suite\.cc": [
     "+gpu/config",
diff --git a/cc/test/animation_test_common.cc b/cc/test/animation_test_common.cc
index e816a3c2..65173e3 100644
--- a/cc/test/animation_test_common.cc
+++ b/cc/test/animation_test_common.cc
@@ -331,9 +331,10 @@
   keyframe_effect->AddKeyframeModel(std::move(keyframe_model));
 }
 
-void RemoveKeyframeModelsFromElementWithExistingKeyframeEffect(
+void RemoveKeyframeModelFromElementWithExistingKeyframeEffect(
     ElementId element_id,
-    scoped_refptr<AnimationTimeline> timeline) {
+    scoped_refptr<AnimationTimeline> timeline,
+    int keyframe_model_id) {
   scoped_refptr<ElementAnimations> element_animations =
       timeline->animation_host()->GetElementAnimationsForElementId(element_id);
   DCHECK(element_animations);
@@ -341,7 +342,7 @@
   KeyframeEffect* keyframe_effect =
       &*element_animations->keyframe_effects_list().begin();
   DCHECK(keyframe_effect);
-  keyframe_effect->RemoveKeyframeModels();
+  keyframe_effect->RemoveKeyframeModel(keyframe_model_id);
 }
 
 KeyframeModel* GetKeyframeModelFromElementWithExistingKeyframeEffect(
diff --git a/cc/test/animation_test_common.h b/cc/test/animation_test_common.h
index 87627922..aabf174 100644
--- a/cc/test/animation_test_common.h
+++ b/cc/test/animation_test_common.h
@@ -116,9 +116,10 @@
     scoped_refptr<AnimationTimeline> timeline,
     std::unique_ptr<KeyframeModel> keyframe_model);
 
-void RemoveKeyframeModelsFromElementWithExistingKeyframeEffect(
+void RemoveKeyframeModelFromElementWithExistingKeyframeEffect(
     ElementId element_id,
-    scoped_refptr<AnimationTimeline> timeline);
+    scoped_refptr<AnimationTimeline> timeline,
+    int keyframe_model_id);
 
 KeyframeModel* GetKeyframeModelFromElementWithExistingKeyframeEffect(
     ElementId element_id,
diff --git a/cc/test/fake_proxy.cc b/cc/test/fake_proxy.cc
index fed9365..091fbdf 100644
--- a/cc/test/fake_proxy.cc
+++ b/cc/test/fake_proxy.cc
@@ -12,6 +12,10 @@
   layer_tree_host_ = host;
 }
 
+bool FakeProxy::RequestedAnimatePending() {
+  return false;
+}
+
 bool FakeProxy::IsStarted() const { return true; }
 
 bool FakeProxy::CommitToActiveTree() const {
diff --git a/cc/test/fake_proxy.h b/cc/test/fake_proxy.h
index c7883c40..905d7e040 100644
--- a/cc/test/fake_proxy.h
+++ b/cc/test/fake_proxy.h
@@ -30,6 +30,7 @@
   void SetNeedsCommit() override {}
   void SetNeedsRedraw(const gfx::Rect& damage_rect) override {}
   void SetNextCommitWaitsForActivation() override {}
+  bool RequestedAnimatePending() override;
   void NotifyInputThrottledUntilCommit() override {}
   void SetDeferCommits(bool defer_commits) override {}
   void MainThreadHasStoppedFlinging() override {}
diff --git a/cc/test/run_all_perftests.cc b/cc/test/run_all_perftests.cc
index 26bc473..641ebbdf 100644
--- a/cc/test/run_all_perftests.cc
+++ b/cc/test/run_all_perftests.cc
@@ -6,12 +6,12 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
 #include "cc/test/cc_test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   cc::CCTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   // Always run the perf tests serially, to avoid distorting
   // perf measurements with randomness resulting from running
diff --git a/cc/test/run_all_unittests.cc b/cc/test/run_all_unittests.cc
index 57263f9..2184ed9 100644
--- a/cc/test/run_all_unittests.cc
+++ b/cc/test/run_all_unittests.cc
@@ -5,12 +5,12 @@
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "cc/test/cc_test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   cc::CCTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(
       argc,
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index aecab9db..8aa14130 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -537,6 +537,10 @@
   swap_promise_manager_.NotifySwapPromiseMonitorsOfSetNeedsCommit();
 }
 
+bool LayerTreeHost::RequestedMainFramePending() {
+  return proxy_->RequestedAnimatePending();
+}
+
 void LayerTreeHost::SetNeedsRecalculateRasterScales() {
   next_commit_forces_recalculate_raster_scales_ = true;
   proxy_->SetNeedsCommit();
@@ -1203,16 +1207,18 @@
 }
 
 void LayerTreeHost::SetContentSourceId(uint32_t id) {
-  if (content_source_id_ == id)
-    return;
   content_source_id_ = id;
-  SetNeedsCommit();
 }
 
 void LayerTreeHost::SetLocalSurfaceIdFromParent(
     const viz::LocalSurfaceId& local_surface_id_from_parent) {
-  if (local_surface_id_from_parent_ == local_surface_id_from_parent)
+  if (local_surface_id_from_parent_.parent_sequence_number() ==
+          local_surface_id_from_parent.parent_sequence_number() &&
+      local_surface_id_from_parent_.embed_token() ==
+          local_surface_id_from_parent.embed_token()) {
     return;
+  }
+
   TRACE_EVENT_WITH_FLOW2(
       TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
       "LocalSurfaceId.Submission.Flow",
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index bc0b115..d19cfc6 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -171,6 +171,10 @@
   // synchronization.
   virtual void SetNeedsCommit();
 
+  // Returns true after SetNeedsAnimate(), SetNeedsUpdateLayers() or
+  // SetNeedsCommit(), until it is satisfied.
+  bool RequestedMainFramePending();
+
   // Requests that the next frame re-chooses crisp raster scales for all layers.
   void SetNeedsRecalculateRasterScales();
 
@@ -181,6 +185,9 @@
   // Enables/disables the compositor from requesting main frame updates from the
   // client.
   void SetDeferCommits(bool defer_commits);
+  // Returns the value last passed to SetDeferCommits(), though commits may be
+  // deferred also when the local_surface_id_from_parent() is not valid.
+  bool defer_commits() const { return defer_commits_; }
 
   // Synchronously performs a main frame update and layer updates. Used only in
   // single threaded mode when the compositor's internal scheduling is disabled.
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index 62912652..e72d3546 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -7440,12 +7440,9 @@
   EXPECT_EQ(0.f, GetStartingAnimationScale(child_raw));
   EXPECT_EQ(0.f, GetStartingAnimationScale(grand_child_raw));
 
-  grand_parent_animation->AbortKeyframeModelsWithProperty(
-      TargetProperty::TRANSFORM, false);
-  parent_animation->AbortKeyframeModelsWithProperty(TargetProperty::TRANSFORM,
-                                                    false);
-  child_animation->AbortKeyframeModelsWithProperty(TargetProperty::TRANSFORM,
-                                                   false);
+  grand_parent_animation->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+  parent_animation->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+  child_animation->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
 
   TransformOperations perspective;
   perspective.AppendPerspective(10.f);
@@ -7467,8 +7464,7 @@
   EXPECT_EQ(0.f, GetStartingAnimationScale(child_raw));
   EXPECT_EQ(0.f, GetStartingAnimationScale(grand_child_raw));
 
-  child_animation->AbortKeyframeModelsWithProperty(TargetProperty::TRANSFORM,
-                                                   false);
+  child_animation->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
 
   gfx::Transform scale_matrix;
   scale_matrix.Scale(1.f, 2.f);
@@ -8694,8 +8690,8 @@
   update_list = GetUpdateLayerList();
   EXPECT_TRUE(VerifyLayerInList(grandchild, update_list));
 
-  RemoveKeyframeModelsFromElementWithExistingKeyframeEffect(child->element_id(),
-                                                            timeline());
+  RemoveKeyframeModelFromElementWithExistingKeyframeEffect(
+      child->element_id(), timeline(), keyframe_model_id);
   child->SetTransform(gfx::Transform());
   child->SetOpacity(0.f);
   ExecuteCalculateDrawPropertiesAndSaveUpdateLayerList(root.get());
@@ -9834,8 +9830,8 @@
   EXPECT_TRUE(node->is_currently_animating_opacity);
   EXPECT_TRUE(node->has_potential_opacity_animation);
 
-  animation->AbortKeyframeModelsWithProperty(TargetProperty::OPACITY,
-                                             false /*needs_completion*/);
+  animation->AbortKeyframeModels(TargetProperty::OPACITY,
+                                 false /*needs_completion*/);
   node = tree.Node(animated->effect_tree_index());
   EXPECT_FALSE(node->is_currently_animating_opacity);
   EXPECT_FALSE(node->has_potential_opacity_animation);
@@ -9893,8 +9889,8 @@
   EXPECT_TRUE(node->is_currently_animating);
   EXPECT_TRUE(node->has_potential_animation);
 
-  animation->AbortKeyframeModelsWithProperty(TargetProperty::TRANSFORM,
-                                             false /*needs_completion*/);
+  animation->AbortKeyframeModels(TargetProperty::TRANSFORM,
+                                 false /*needs_completion*/);
   node = tree.Node(animated->transform_tree_index());
   EXPECT_FALSE(node->is_currently_animating);
   EXPECT_FALSE(node->has_potential_animation);
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index efd246e..b438f03 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -4358,8 +4358,8 @@
 
 bool LayerTreeHostImpl::GetSnapFlingInfo(
     const gfx::Vector2dF& natural_displacement_in_viewport,
-    gfx::Vector2dF* initial_offset,
-    gfx::Vector2dF* target_offset) const {
+    gfx::Vector2dF* out_initial_offset,
+    gfx::Vector2dF* out_target_offset) const {
   const ScrollNode* scroll_node = CurrentlyScrollingNode();
   if (!scroll_node || !scroll_node->snap_container_data.has_value())
     return false;
@@ -4369,7 +4369,7 @@
   gfx::Vector2dF natural_displacement_in_content =
       gfx::ScaleVector2d(natural_displacement_in_viewport, 1.f / scale_factor);
 
-  *initial_offset =
+  *out_initial_offset =
       ScrollOffsetToVector2dF(GetVisualScrollOffset(*scroll_node));
 
   bool did_scroll_x = did_scroll_x_for_scroll_gesture_ ||
@@ -4378,15 +4378,15 @@
                       natural_displacement_in_content.y() != 0;
 
   gfx::ScrollOffset snap_offset;
-  if (!data.FindSnapPosition(
-          gfx::ScrollOffset(*initial_offset + natural_displacement_in_content),
-          did_scroll_x, did_scroll_y, &snap_offset)) {
+  if (!data.FindSnapPosition(gfx::ScrollOffset(*out_initial_offset +
+                                               natural_displacement_in_content),
+                             did_scroll_x, did_scroll_y, &snap_offset)) {
     return false;
   }
 
-  *target_offset = ScrollOffsetToVector2dF(snap_offset);
-  target_offset->Scale(scale_factor);
-  initial_offset->Scale(scale_factor);
+  *out_target_offset = ScrollOffsetToVector2dF(snap_offset);
+  out_target_offset->Scale(scale_factor);
+  out_initial_offset->Scale(scale_factor);
   return true;
 }
 
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index dcdfa51..bc80fc9 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -615,8 +615,8 @@
   gfx::ScrollOffset GetVisualScrollOffset(const ScrollNode& scroll_node) const;
 
   bool GetSnapFlingInfo(const gfx::Vector2dF& natural_displacement_in_viewport,
-                        gfx::Vector2dF* initial_offset,
-                        gfx::Vector2dF* target_offset) const override;
+                        gfx::Vector2dF* out_initial_offset,
+                        gfx::Vector2dF* out_target_offset) const override;
 
   // Returns the amount of delta that can be applied to scroll_node, taking
   // page scale into account.
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index 1138f338..54ef932 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -216,6 +216,48 @@
 
 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestFrameOrdering);
 
+class LayerTreeHostTestRequestedMainFrame : public LayerTreeHostTest {
+ public:
+  void BeginTest() override { PostSetNeedsCommitToMainThread(); }
+
+  void WillBeginMainFrame() override {
+    // Post NextStep() so it happens after the MainFrame completes.
+    MainThreadTaskRunner()->PostTask(
+        FROM_HERE,
+        base::BindOnce(&LayerTreeHostTestRequestedMainFrame::NextStep,
+                       base::Unretained(this)));
+  }
+
+  void NextStep() {
+    // The MainFrame request is cleared once a MainFrame happens.
+    EXPECT_FALSE(layer_tree_host()->RequestedMainFramePending());
+    switch (layer_tree_host()->SourceFrameNumber()) {
+      case 0:
+        ADD_FAILURE()
+            << "Case 0 is the initial commit used to send the test here";
+        FALLTHROUGH;
+      case 1:
+        layer_tree_host()->SetNeedsAnimate();
+        break;
+      case 2:
+        layer_tree_host()->SetNeedsUpdateLayers();
+        break;
+      case 3:
+        layer_tree_host()->SetNeedsCommit();
+        break;
+      case 4:
+        EndTest();
+        return;
+    }
+    // SetNeeds{Animate,UpdateLayers,Commit}() will mean a MainFrame is pending.
+    EXPECT_TRUE(layer_tree_host()->RequestedMainFramePending());
+  }
+
+  void AfterTest() override {}
+};
+
+SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestRequestedMainFrame);
+
 class LayerTreeHostTestSetNeedsUpdateInsideLayout : public LayerTreeHostTest {
  protected:
   void BeginTest() override { PostSetNeedsCommitToMainThread(); }
@@ -7716,6 +7758,48 @@
 };
 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestLocalSurfaceId);
 
+// Makes sure that LayerTreeHost does not pick up changes to
+// viz::LocalSurfaceIds that only involve the child sequence number.
+class LayerTreeHostTestLocalSurfaceIdSkipChildNum : public LayerTreeHostTest {
+ protected:
+  void InitializeSettings(LayerTreeSettings* settings) override {
+    settings->enable_surface_synchronization = true;
+  }
+
+  void BeginTest() override {
+    expected_local_surface_id_ = allocator_.GetCurrentLocalSurfaceId();
+    EXPECT_TRUE(child_allocator_.UpdateFromParent(expected_local_surface_id_));
+    child_local_surface_id_ = child_allocator_.GenerateId();
+    EXPECT_NE(expected_local_surface_id_, child_local_surface_id_);
+    PostSetLocalSurfaceIdToMainThread(expected_local_surface_id_);
+    PostSetLocalSurfaceIdToMainThread(child_local_surface_id_);
+  }
+
+  DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
+                                   LayerTreeHostImpl::FrameData* frame_data,
+                                   DrawResult draw_result) override {
+    EXPECT_EQ(DRAW_SUCCESS, draw_result);
+    // We should not be picking up the newer |child_local_surface_id_|.
+    EXPECT_EQ(expected_local_surface_id_,
+              host_impl->active_tree()->local_surface_id_from_parent());
+    return draw_result;
+  }
+
+  void DisplayReceivedLocalSurfaceIdOnThread(
+      const viz::LocalSurfaceId& local_surface_id) override {
+    EXPECT_EQ(expected_local_surface_id_, local_surface_id);
+    EndTest();
+  }
+
+  void AfterTest() override {}
+
+  viz::LocalSurfaceId expected_local_surface_id_;
+  viz::LocalSurfaceId child_local_surface_id_;
+  viz::ParentLocalSurfaceIdAllocator allocator_;
+  viz::ChildLocalSurfaceIdAllocator child_allocator_;
+};
+SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestLocalSurfaceIdSkipChildNum);
+
 // Makes sure that viz::LocalSurfaceId allocation requests propagate all the way
 // to LayerTreeFrameSink.
 class LayerTreeHostTestRequestNewLocalSurfaceId : public LayerTreeHostTest {
diff --git a/cc/trees/layer_tree_host_unittest_animation.cc b/cc/trees/layer_tree_host_unittest_animation.cc
index 732d7ce..f2db9f2f 100644
--- a/cc/trees/layer_tree_host_unittest_animation.cc
+++ b/cc/trees/layer_tree_host_unittest_animation.cc
@@ -191,7 +191,7 @@
     KeyframeModel* keyframe_model =
         animation_->GetKeyframeModel(TargetProperty::OPACITY);
     if (keyframe_model)
-      animation_->RemoveKeyframeModels();
+      animation_->RemoveKeyframeModel(keyframe_model->id());
 
     EndTest();
   }
@@ -429,7 +429,7 @@
     KeyframeModel* keyframe_model =
         animation_child_->GetKeyframeModel(TargetProperty::OPACITY);
     main_start_time_ = keyframe_model->start_time();
-    animation_child_->RemoveKeyframeModels();
+    animation_child_->RemoveKeyframeModel(keyframe_model->id());
     EndTest();
   }
 
@@ -480,7 +480,7 @@
     KeyframeModel* keyframe_model =
         animation_->GetKeyframeModel(TargetProperty::OPACITY);
     if (keyframe_model)
-      animation_->RemoveKeyframeModels();
+      animation_->RemoveKeyframeModel(keyframe_model->id());
     EndTest();
   }
 
@@ -520,7 +520,9 @@
         static_cast<SingleKeyframeEffectAnimation*>(
             timeline_impl->GetAnimationById(animation_id_));
 
-    animation_impl->RemoveKeyframeModels();
+    KeyframeModel* keyframe_model_impl =
+        animation_impl->GetKeyframeModel(TargetProperty::OPACITY);
+    animation_impl->RemoveKeyframeModel(keyframe_model_impl->id());
     EndTest();
   }
 
@@ -1126,7 +1128,9 @@
       case 1: {
         EXPECT_GE(scroll_layer_->CurrentScrollOffset().x(), 100);
         EXPECT_GE(scroll_layer_->CurrentScrollOffset().y(), 200);
-        animation_child_->RemoveKeyframeModels();
+        KeyframeModel* keyframe_model =
+            animation_child_->GetKeyframeModel(TargetProperty::SCROLL_OFFSET);
+        animation_child_->RemoveKeyframeModel(keyframe_model->id());
         scroll_layer_->SetScrollOffset(final_postion_);
         break;
       }
@@ -1292,12 +1296,9 @@
     EXPECT_EQ(KeyframeModel::RUNNING, child_keyframe_model->run_state());
     EXPECT_EQ(root_keyframe_model->start_time(),
               child_keyframe_model->start_time());
-    animation_impl->AbortKeyframeModelsWithProperty(TargetProperty::OPACITY,
-                                                    false);
-    animation_impl->AbortKeyframeModelsWithProperty(TargetProperty::TRANSFORM,
-                                                    false);
-    animation_child_impl->AbortKeyframeModelsWithProperty(
-        TargetProperty::OPACITY, false);
+    animation_impl->AbortKeyframeModels(TargetProperty::OPACITY, false);
+    animation_impl->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
+    animation_child_impl->AbortKeyframeModels(TargetProperty::OPACITY, false);
     EndTest();
   }
 
@@ -1375,8 +1376,7 @@
     // And the sync tree layer should know it is animating.
     EXPECT_TRUE(child->screen_space_transform_is_animating());
 
-    animation_impl->AbortKeyframeModelsWithProperty(TargetProperty::TRANSFORM,
-                                                    false);
+    animation_impl->AbortKeyframeModels(TargetProperty::TRANSFORM, false);
     EndTest();
   }
 
@@ -1590,7 +1590,9 @@
         AddAnimatedTransformToAnimation(animation_child_.get(), 1.0, 5, 5);
         break;
       case 2:
-        animation_child_->RemoveKeyframeModels();
+        KeyframeModel* keyframe_model =
+            animation_child_->GetKeyframeModel(TargetProperty::TRANSFORM);
+        animation_child_->RemoveKeyframeModel(keyframe_model->id());
         gfx::Transform transform;
         transform.Translate(10.f, 10.f);
         layer_->SetTransform(transform);
@@ -1690,7 +1692,9 @@
         AddAnimatedTransformToAnimation(animation_.get(), 1.0, 5, 5);
         break;
       case 2:
-        animation_->RemoveKeyframeModels();
+        KeyframeModel* keyframe_model =
+            animation_->GetKeyframeModel(TargetProperty::TRANSFORM);
+        animation_->RemoveKeyframeModel(keyframe_model->id());
         break;
     }
   }
diff --git a/cc/trees/proxy.h b/cc/trees/proxy.h
index 459486d..41e63dd9 100644
--- a/cc/trees/proxy.h
+++ b/cc/trees/proxy.h
@@ -50,6 +50,10 @@
   virtual void SetNeedsRedraw(const gfx::Rect& damage_rect) = 0;
   virtual void SetNextCommitWaitsForActivation() = 0;
 
+  // Returns true if an animate or commit has been requested, and hasn't
+  // completed yet.
+  virtual bool RequestedAnimatePending() = 0;
+
   virtual void NotifyInputThrottledUntilCommit() = 0;
 
   // Defers commits until it is reset. It is only supported when using a
diff --git a/cc/trees/proxy_main.cc b/cc/trees/proxy_main.cc
index 8d4a5a9..6315bf162 100644
--- a/cc/trees/proxy_main.cc
+++ b/cc/trees/proxy_main.cc
@@ -418,6 +418,10 @@
   commit_waits_for_activation_ = true;
 }
 
+bool ProxyMain::RequestedAnimatePending() {
+  return max_requested_pipeline_stage_ >= ANIMATE_PIPELINE_STAGE;
+}
+
 void ProxyMain::NotifyInputThrottledUntilCommit() {
   DCHECK(IsMainThread());
   ImplThreadTaskRunner()->PostTask(
diff --git a/cc/trees/proxy_main.h b/cc/trees/proxy_main.h
index aae1860..a15fe46d 100644
--- a/cc/trees/proxy_main.h
+++ b/cc/trees/proxy_main.h
@@ -79,6 +79,7 @@
   void SetNeedsCommit() override;
   void SetNeedsRedraw(const gfx::Rect& damage_rect) override;
   void SetNextCommitWaitsForActivation() override;
+  bool RequestedAnimatePending() override;
   void NotifyInputThrottledUntilCommit() override;
   void SetDeferCommits(bool defer_commits) override;
   bool CommitRequested() const override;
diff --git a/cc/trees/single_thread_proxy.cc b/cc/trees/single_thread_proxy.cc
index d4cb06b..1d199d2f 100644
--- a/cc/trees/single_thread_proxy.cc
+++ b/cc/trees/single_thread_proxy.cc
@@ -257,6 +257,10 @@
   DCHECK(task_runner_provider_->IsMainThread());
 }
 
+bool SingleThreadProxy::RequestedAnimatePending() {
+  return animate_requested_ || commit_requested_;
+}
+
 void SingleThreadProxy::SetDeferCommits(bool defer_commits) {
   DCHECK(task_runner_provider_->IsMainThread());
   // Deferring commits only makes sense if there's a scheduler.
@@ -521,7 +525,13 @@
 #if DCHECK_IS_ON()
     DCHECK(inside_impl_frame_);
 #endif
+    animate_requested_ = false;
+    // Prevent new commits from being requested inside DoBeginMainFrame.
+    // Note: We do not want to prevent SetNeedsAnimate from requesting
+    // a commit here.
+    commit_requested_ = true;
     DoBeginMainFrame(begin_frame_args);
+    commit_requested_ = false;
     DoPainting();
     DoCommit();
 
diff --git a/cc/trees/single_thread_proxy.h b/cc/trees/single_thread_proxy.h
index fe0f404..1cfd8638 100644
--- a/cc/trees/single_thread_proxy.h
+++ b/cc/trees/single_thread_proxy.h
@@ -49,6 +49,7 @@
   void SetNeedsCommit() override;
   void SetNeedsRedraw(const gfx::Rect& damage_rect) override;
   void SetNextCommitWaitsForActivation() override;
+  bool RequestedAnimatePending() override;
   void NotifyInputThrottledUntilCommit() override {}
   void SetDeferCommits(bool defer_commits) override;
   bool CommitRequested() const override;
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 652022f..5d7d370 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -298,11 +298,11 @@
       }
 
       if (is_chromeos || is_win) {
-        data_deps += [ "//mojo/edk:mojo_core" ]
+        data_deps += [ "//mojo/core:shared_library" ]
       }
 
       if (is_chromeos) {
-        data_deps += [ "//mojo/edk:mojo_core_for_arc" ]
+        data_deps += [ "//mojo/core:shared_libraries_for_arc" ]
       }
 
       # These files are used by the installer so we need a public dep.
diff --git a/chrome/VERSION b/chrome/VERSION
index 5db80e5b..9f769ca 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=69
 MINOR=0
-BUILD=3482
+BUILD=3483
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index 296be247..c519792 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -398,8 +398,8 @@
             getWindowAndroid().setAnimationPlaceholderView(
                     mCompositorViewHolder.getCompositorView());
 
-            initializeToolbar();
             initializeTabModels();
+            initializeToolbar();
             if (!isFinishing() && getFullscreenManager() != null) {
                 getFullscreenManager().initialize(
                         (ControlContainer) findViewById(R.id.control_container),
@@ -519,10 +519,7 @@
         // If the UI was inflated on a background thread, then the CompositorView may not have been
         // fully initialized yet as that may require the creation of a handler which is not allowed
         // outside the UI thread. This call should fully initialize the CompositorView if it hasn't
-        // been yet. If inflation was performed on a background thread, this call should be made in
-        // the same Looper call as setting the content view or transferring the view hierarchy, ie.
-        // before a UI redraw, otherwise some visual artifacts may occur, see
-        // https://crbug.com/704866
+        // been yet.
         mCompositorViewHolder.setRootView(rootView);
 
         // Setting fitsSystemWindows to false ensures that the root view doesn't consume the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsService.java b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsService.java
index 5a78eaf..92e8bec 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browseractions/BrowserActionsService.java
@@ -111,7 +111,8 @@
                     .show();
             updateNumTabCreatedInBackground();
             NotificationUmaTracker.getInstance().onNotificationShown(
-                    NotificationUmaTracker.BROWSER_ACTIONS, ChannelDefinitions.CHANNEL_ID_BROWSER);
+                    NotificationUmaTracker.SystemNotificationType.BROWSER_ACTIONS,
+                    ChannelDefinitions.CHANNEL_ID_BROWSER);
         } else if (TextUtils.equals(intent.getAction(), ACTION_TAB_CREATION_CHROME_DISPLAYED)) {
             clearPendingStatus();
             removeObserver();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClient.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClient.java
index aee1928..4ed79d6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClient.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityClient.java
@@ -64,7 +64,7 @@
 
             if (success) {
                 NotificationUmaTracker.getInstance().onNotificationShown(
-                        NotificationUmaTracker.SITES, null);
+                        NotificationUmaTracker.SystemNotificationType.SITES, null);
             }
         });
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
index 595e5806..1e4983f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -1355,8 +1355,9 @@
         // we had built one for this download before.
         if (mDownloadSharedPreferenceHelper.hasEntry(id)) return;
         NotificationUmaTracker.getInstance().onNotificationShown(
-                LegacyHelpers.isLegacyOfflinePage(id) ? NotificationUmaTracker.DOWNLOAD_PAGES
-                                                      : NotificationUmaTracker.DOWNLOAD_FILES,
+                LegacyHelpers.isLegacyOfflinePage(id)
+                        ? NotificationUmaTracker.SystemNotificationType.DOWNLOAD_PAGES
+                        : NotificationUmaTracker.SystemNotificationType.DOWNLOAD_FILES,
                 ChannelDefinitions.CHANNEL_ID_DOWNLOADS);
 
         // Record number of other notifications when there's a new notification.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java
index 6eb7e4f..0818b3c1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService2.java
@@ -478,8 +478,9 @@
         // we had built one for this download before.
         if (mDownloadSharedPreferenceHelper.hasEntry(id)) return;
         NotificationUmaTracker.getInstance().onNotificationShown(
-                LegacyHelpers.isLegacyOfflinePage(id) ? NotificationUmaTracker.DOWNLOAD_PAGES
-                                                      : NotificationUmaTracker.DOWNLOAD_FILES,
+                LegacyHelpers.isLegacyOfflinePage(id)
+                        ? NotificationUmaTracker.SystemNotificationType.DOWNLOAD_PAGES
+                        : NotificationUmaTracker.SystemNotificationType.DOWNLOAD_FILES,
                 ChannelDefinitions.CHANNEL_ID_DOWNLOADS);
 
         // Record the number of other notifications when there's a new notification.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java
index bda88df..0b59868 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java
@@ -11,9 +11,13 @@
 import static org.chromium.chrome.browser.download.DownloadNotificationService2.ACTION_DOWNLOAD_PAUSE;
 import static org.chromium.chrome.browser.download.DownloadNotificationService2.ACTION_DOWNLOAD_RESUME;
 
+import android.support.annotation.IntDef;
+
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.metrics.RecordHistogram;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.Arrays;
 import java.util.List;
 
@@ -23,20 +27,26 @@
 public final class DownloadNotificationUmaHelper {
     // The state of a download or offline page request at user-initiated cancel.
     // Keep in sync with enum OfflineItemsStateAtCancel in enums.xml.
-    static class StateAtCancel {
-        static final int DOWNLOADING = 0;
-        static final int PAUSED = 1;
-        static final int PENDING_NETWORK = 2;
-        static final int PENDING_ANOTHER_DOWNLOAD = 3;
-        static final int MAX = 4;
+    @IntDef({StateAtCancel.DOWNLOADING, StateAtCancel.PAUSED, StateAtCancel.PENDING_NETWORK,
+            StateAtCancel.PENDING_ANOTHER_DOWNLOAD})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface StateAtCancel {
+        int DOWNLOADING = 0;
+        int PAUSED = 1;
+        int PENDING_NETWORK = 2;
+        int PENDING_ANOTHER_DOWNLOAD = 3;
+
+        int NUM_ENTRIES = 4;
     }
 
     // NOTE: Keep these lists/classes in sync with DownloadNotification[...] in enums.xml.
-    static class ForegroundLifecycle {
-        static final int START = 0; // Initial startForeground.
-        static final int UPDATE = 1; // Switching pinned notification.
-        static final int STOP = 2; // Calling stopForeground.
-        static final int MAX = 3;
+    @IntDef({ForegroundLifecycle.START, ForegroundLifecycle.UPDATE, ForegroundLifecycle.STOP})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ForegroundLifecycle {
+        int START = 0; // Initial startForeground.
+        int UPDATE = 1; // Switching pinned notification.
+        int STOP = 2; // Calling stopForeground.
+        int NUM_ENTRIES = 3;
     }
 
     private static List<String> sInteractions = Arrays.asList(
@@ -44,19 +54,24 @@
             ACTION_DOWNLOAD_OPEN, // Opening a download that is not a legacy download.
             ACTION_DOWNLOAD_CANCEL, ACTION_DOWNLOAD_PAUSE, ACTION_DOWNLOAD_RESUME);
 
-    static class LaunchType {
-        static final int LAUNCH = 0; // "Denominator" for expected launched notifications.
-        static final int RELAUNCH = 1;
-        static final int MAX = 2;
+    @IntDef({LaunchType.LAUNCH, LaunchType.RELAUNCH})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface LaunchType {
+        int LAUNCH = 0; // "Denominator" for expected launched notifications.
+        int RELAUNCH = 1;
+        int NUM_ENTRIES = 2;
     }
 
-    static class ServiceStopped {
-        static final int STOPPED = 0; // Expected, intentional stops, serves as a "denominator".
-        static final int DESTROYED = 1;
-        static final int TASK_REMOVED = 2;
-        static final int LOW_MEMORY = 3;
-        static final int START_STICKY = 4;
-        static final int MAX = 5;
+    @IntDef({ServiceStopped.STOPPED, ServiceStopped.DESTROYED, ServiceStopped.TASK_REMOVED,
+            ServiceStopped.LOW_MEMORY, ServiceStopped.START_STICKY})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface ServiceStopped {
+        int STOPPED = 0; // Expected, intentional stops, serves as a "denominator".
+        int DESTROYED = 1;
+        int TASK_REMOVED = 2;
+        int LOW_MEMORY = 3;
+        int START_STICKY = 4;
+        int NUM_ENTRIES = 5;
     }
 
     /**
@@ -76,16 +91,17 @@
      * understand the frequency of unexpected stops (low memory, task removed, etc).
      * @param stopType Type of the foreground stop that is being recorded ({@link ServiceStopped}).
      */
-    static void recordServiceStoppedHistogram(int stopType, boolean withForeground) {
+    static void recordServiceStoppedHistogram(
+            @ServiceStopped int stopType, boolean withForeground) {
         if (!LibraryLoader.getInstance().isInitialized()) return;
         if (withForeground) {
             RecordHistogram.recordEnumeratedHistogram(
                     "Android.DownloadManager.ServiceStopped.DownloadForeground", stopType,
-                    ServiceStopped.MAX);
+                    ServiceStopped.NUM_ENTRIES);
         } else {
             RecordHistogram.recordEnumeratedHistogram(
                     "Android.DownloadManager.ServiceStopped.DownloadNotification", stopType,
-                    ServiceStopped.MAX);
+                    ServiceStopped.NUM_ENTRIES);
         }
     }
 
@@ -94,11 +110,11 @@
      * starts, changes pinned notification, or stops).
      * @param lifecycleStep The lifecycle step that is being recorded ({@link ForegroundLifecycle}).
      */
-    static void recordForegroundServiceLifecycleHistogram(int lifecycleStep) {
+    static void recordForegroundServiceLifecycleHistogram(@ForegroundLifecycle int lifecycleStep) {
         if (!LibraryLoader.getInstance().isInitialized()) return;
         RecordHistogram.recordEnumeratedHistogram(
                 "Android.DownloadManager.ForegroundServiceLifecycle", lifecycleStep,
-                ForegroundLifecycle.MAX);
+                ForegroundLifecycle.NUM_ENTRIES);
     }
 
     /**
@@ -124,10 +140,10 @@
      * to the need to dissociate the notification from the foreground (only on API < 24).
      * @param launchType Whether it is a launch or a relaunch ({@link LaunchType}).
      */
-    static void recordNotificationFlickerCountHistogram(int launchType) {
+    static void recordNotificationFlickerCountHistogram(@LaunchType int launchType) {
         if (!LibraryLoader.getInstance().isInitialized()) return;
         RecordHistogram.recordEnumeratedHistogram(
-                "Android.DownloadManager.NotificationLaunch", launchType, LaunchType.MAX);
+                "Android.DownloadManager.NotificationLaunch", launchType, LaunchType.NUM_ENTRIES);
     }
 
     /**
@@ -135,15 +151,17 @@
      * @param isDownload True if the request is a download, false if it is an offline page.
      * @param state State of a request when cancelled (e.g. downloading, paused).
      */
-    static void recordStateAtCancelHistogram(boolean isDownload, int state) {
+    static void recordStateAtCancelHistogram(boolean isDownload, @StateAtCancel int state) {
         if (state == -1) return;
         if (!LibraryLoader.getInstance().isInitialized()) return;
         if (isDownload) {
             RecordHistogram.recordEnumeratedHistogram(
-                    "Android.OfflineItems.StateAtCancel.Downloads", state, StateAtCancel.MAX);
+                    "Android.OfflineItems.StateAtCancel.Downloads", state,
+                    StateAtCancel.NUM_ENTRIES);
         } else {
             RecordHistogram.recordEnumeratedHistogram(
-                    "Android.OfflineItems.StateAtCancel.OfflinePages", state, StateAtCancel.MAX);
+                    "Android.OfflineItems.StateAtCancel.OfflinePages", state,
+                    StateAtCancel.NUM_ENTRIES);
         }
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegate.java
index 0cb7c6d..e15b92d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegate.java
@@ -111,7 +111,8 @@
      * @return OverrideUrlLoadingResult (if the tab has been clobbered, or we're launching an
      *         intent.)
      */
-    OverrideUrlLoadingResult clobberCurrentTab(String url, String referrerUrl);
+    @OverrideUrlLoadingResult
+    int clobberCurrentTab(String url, String referrerUrl);
 
     /** Adds a window id to the intent, if necessary. */
     void maybeSetWindowId(Intent intent);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
index 7b480bbc..2f907e5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationDelegateImpl.java
@@ -523,7 +523,7 @@
     }
 
     @Override
-    public OverrideUrlLoadingResult clobberCurrentTab(String url, String referrerUrl) {
+    public @OverrideUrlLoadingResult int clobberCurrentTab(String url, String referrerUrl) {
         int transitionType = PageTransition.LINK;
         final LoadUrlParams loadUrlParams = new LoadUrlParams(url, transitionType);
         if (!TextUtils.isEmpty(referrerUrl)) {
@@ -539,9 +539,7 @@
                 @Override
                 public void run() {
                     // Tab might be closed when this is run. See https://crbug.com/662877
-                    if (!mIsTabDestroyed) {
-                        mTab.loadUrl(loadUrlParams);
-                    }
+                    if (!mIsTabDestroyed) mTab.loadUrl(loadUrlParams);
                 }
             });
             return OverrideUrlLoadingResult.OVERRIDE_WITH_CLOBBERING_TAB;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
index d5b7e507..851962c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandler.java
@@ -39,6 +39,8 @@
 import org.chromium.content_public.common.ContentUrlConstants;
 import org.chromium.ui.base.PageTransition;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.HashSet;
@@ -73,29 +75,40 @@
     static final String EXTRA_MARKET_REFERRER = "market_referrer";
 
     // These values are persisted in histograms. Please do not renumber. Append only.
-    @IntDef({AIA_INTENT_FALLBACK_USED, AIA_INTENT_SERP, AIA_INTENT_OTHER, AIA_INTENT_BOUNDARY})
-    public @interface AiaIntent {}
-    private static final int AIA_INTENT_FALLBACK_USED = 0;
-    private static final int AIA_INTENT_SERP = 1;
-    private static final int AIA_INTENT_OTHER = 2;
-    private static final int AIA_INTENT_BOUNDARY = 3;
+    @IntDef({AiaIntent.FALLBACK_USED, AiaIntent.SERP, AiaIntent.OTHER})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface AiaIntent {
+        int FALLBACK_USED = 0;
+        int SERP = 1;
+        int OTHER = 2;
+
+        int NUM_ENTRIES = 3;
+    }
 
     private final ExternalNavigationDelegate mDelegate;
 
     /**
      * Result types for checking if we should override URL loading.
      * NOTE: this enum is used in UMA, do not reorder values. Changes should be append only.
+     * Values should be numerated from 0 and can't have gaps.
      */
-    public enum OverrideUrlLoadingResult {
+    @IntDef({OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT,
+            OverrideUrlLoadingResult.OVERRIDE_WITH_CLOBBERING_TAB,
+            OverrideUrlLoadingResult.OVERRIDE_WITH_ASYNC_ACTION,
+            OverrideUrlLoadingResult.NO_OVERRIDE})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface OverrideUrlLoadingResult {
         /* We should override the URL loading and launch an intent. */
-        OVERRIDE_WITH_EXTERNAL_INTENT,
+        int OVERRIDE_WITH_EXTERNAL_INTENT = 0;
         /* We should override the URL loading and clobber the current tab. */
-        OVERRIDE_WITH_CLOBBERING_TAB,
+        int OVERRIDE_WITH_CLOBBERING_TAB = 1;
         /* We should override the URL loading.  The desired action will be determined
          * asynchronously (e.g. by requiring user confirmation). */
-        OVERRIDE_WITH_ASYNC_ACTION,
+        int OVERRIDE_WITH_ASYNC_ACTION = 2;
         /* We shouldn't override the URL loading. */
-        NO_OVERRIDE,
+        int NO_OVERRIDE = 3;
+
+        int NUM_ENTRIES = 4;
     }
 
     /**
@@ -121,7 +134,7 @@
      * @return Whether the URL generated an intent, caused a navigation in
      *         current tab, or wasn't handled at all.
      */
-    public OverrideUrlLoadingResult shouldOverrideUrlLoading(ExternalNavigationParams params) {
+    public @OverrideUrlLoadingResult int shouldOverrideUrlLoading(ExternalNavigationParams params) {
         if (DEBUG) Log.i(TAG, "shouldOverrideUrlLoading called on " + params.getUrl());
         Intent intent;
         // Perform generic parsing of the URI to turn it into an Intent.
@@ -143,7 +156,8 @@
         }
 
         long time = SystemClock.elapsedRealtime();
-        OverrideUrlLoadingResult result = shouldOverrideUrlLoadingInternal(
+        @OverrideUrlLoadingResult
+        int result = shouldOverrideUrlLoadingInternal(
                 params, intent, hasBrowserFallbackUrl, browserFallbackUrl);
         RecordHistogram.recordTimesHistogram("Android.StrictMode.OverrideUrlLoadingTime",
                 SystemClock.elapsedRealtime() - time, TimeUnit.MILLISECONDS);
@@ -154,8 +168,8 @@
                         || !params.getRedirectHandler().shouldNotOverrideUrlLoading())) {
             if (InstantAppsHandler.isIntentToInstantApp(intent)) {
                 RecordHistogram.recordEnumeratedHistogram(
-                        "Android.InstantApps.DirectInstantAppsIntent", AIA_INTENT_FALLBACK_USED,
-                        AIA_INTENT_BOUNDARY);
+                        "Android.InstantApps.DirectInstantAppsIntent", AiaIntent.FALLBACK_USED,
+                        AiaIntent.NUM_ENTRIES);
             }
 
             return clobberCurrentTabWithFallbackUrl(browserFallbackUrl, params);
@@ -179,7 +193,7 @@
         return true;
     }
 
-    private OverrideUrlLoadingResult shouldOverrideUrlLoadingInternal(
+    private @OverrideUrlLoadingResult int shouldOverrideUrlLoadingInternal(
             ExternalNavigationParams params, Intent intent, boolean hasBrowserFallbackUrl,
             String browserFallbackUrl) {
         // http://crbug.com/441284 : Disallow firing external intent while Chrome is in the
@@ -501,14 +515,14 @@
         boolean shouldProxyForInstantApps = isDirectInstantAppsIntent && mDelegate.isSerpReferrer();
         if (shouldProxyForInstantApps) {
             RecordHistogram.recordEnumeratedHistogram("Android.InstantApps.DirectInstantAppsIntent",
-                    AIA_INTENT_SERP, AIA_INTENT_BOUNDARY);
+                    AiaIntent.SERP, AiaIntent.NUM_ENTRIES);
             intent.putExtra(InstantAppsHandler.IS_GOOGLE_SEARCH_REFERRER, true);
         } else if (isDirectInstantAppsIntent) {
             // For security reasons, we disable all intent:// URLs to Instant Apps that are
             // not coming from SERP.
             if (DEBUG) Log.i(TAG, "NO_OVERRIDE: Intent URL to an Instant App");
             RecordHistogram.recordEnumeratedHistogram("Android.InstantApps.DirectInstantAppsIntent",
-                    AIA_INTENT_OTHER, AIA_INTENT_BOUNDARY);
+                    AiaIntent.OTHER, AiaIntent.NUM_ENTRIES);
             return OverrideUrlLoadingResult.NO_OVERRIDE;
         } else {
             // Make sure this extra is not sent unless we've done the verification.
@@ -596,7 +610,7 @@
      * @return OVERRIDE_WITH_EXTERNAL_INTENT when we successfully started market activity,
      *         NO_OVERRIDE otherwise.
      */
-    private OverrideUrlLoadingResult sendIntentToMarket(
+    private @OverrideUrlLoadingResult int sendIntentToMarket(
             String packageName, String marketReferrer, ExternalNavigationParams params) {
         try {
             Uri marketUri = new Uri.Builder()
@@ -642,7 +656,7 @@
      * @return {@link OverrideUrlLoadingResult} if the tab was clobbered, or we launched an
      *         intent.
      */
-    private OverrideUrlLoadingResult clobberCurrentTabWithFallbackUrl(
+    private @OverrideUrlLoadingResult int clobberCurrentTabWithFallbackUrl(
             String browserFallbackUrl, ExternalNavigationParams params) {
         // If the fallback URL is a link to Play Store, send the user to Play Store app
         // instead: crbug.com/638672.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
index 3ed7c9e..1d3835f1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
@@ -51,7 +51,8 @@
                 (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
         nm.notify(INCOGNITO_TABS_OPEN_TAG, INCOGNITO_TABS_OPEN_ID, builder.build());
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.CLOSE_INCOGNITO, ChannelDefinitions.CHANNEL_ID_INCOGNITO);
+                NotificationUmaTracker.SystemNotificationType.CLOSE_INCOGNITO,
+                ChannelDefinitions.CHANNEL_ID_INCOGNITO);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
index e2a6dbc..56c9d637 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateCompactInfoBar.java
@@ -383,7 +383,7 @@
                 return;
             case TranslateMenu.ID_OVERFLOW_ALWAYS_TRANSLATE:
                 // Only show snackbar when "Always Translate" is enabled.
-                if (!mOptions.alwaysTranslateLanguageState()) {
+                if (!mOptions.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE)) {
                     recordInfobarAction(INFOBAR_ALWAYS_TRANSLATE);
                     recordInfobarLanguageData(INFOBAR_HISTOGRAM_ALWAYS_TRANSLATE_LANGUAGE,
                             mOptions.sourceLanguageCode());
@@ -540,7 +540,7 @@
                 toggleAlwaysTranslate();
                 // Start translating if always translate is selected and if page is not already
                 // translated to the target language.
-                if (mOptions.alwaysTranslateLanguageState()
+                if (mOptions.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE)
                         && mTabLayout.getSelectedTabPosition() == SOURCE_TAB_INDEX) {
                     startTranslating(mTabLayout.getSelectedTabPosition());
                 }
@@ -567,9 +567,10 @@
     }
 
     private void toggleAlwaysTranslate() {
-        mOptions.toggleAlwaysTranslateLanguageState(!mOptions.alwaysTranslateLanguageState());
+        mOptions.toggleAlwaysTranslateLanguageState(
+                !mOptions.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE));
         nativeApplyBoolTranslateOption(mNativeTranslateInfoBarPtr, TranslateOption.ALWAYS_TRANSLATE,
-                mOptions.alwaysTranslateLanguageState());
+                mOptions.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE));
     }
 
     private static void recordInfobarAction(int action) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateOptions.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateOptions.java
index e275743..9bbaa9c3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateOptions.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/TranslateOptions.java
@@ -4,8 +4,11 @@
 
 package org.chromium.chrome.browser.infobar;
 
+import android.support.annotation.IntDef;
 import android.text.TextUtils;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -38,9 +41,7 @@
 
         @Override
         public boolean equals(Object obj) {
-            if (!(obj instanceof TranslateLanguageData)) {
-                return false;
-            }
+            if (!(obj instanceof TranslateLanguageData)) return false;
             TranslateLanguageData other = (TranslateLanguageData) obj;
             return this.mLanguageCode.equals(other.mLanguageCode)
                     && this.mLanguageRepresentation.equals(other.mLanguageRepresentation)
@@ -59,11 +60,17 @@
         }
     }
 
-    // This would be an enum but they are not good for mobile.
-    // The checkBoundaries method below needs to be updated if new options are added.
-    private static final int NEVER_LANGUAGE = 0;
-    private static final int NEVER_DOMAIN = 1;
-    private static final int ALWAYS_LANGUAGE = 2;
+    // Values must be numerated from 0 and can't have gaps
+    // (they're used for indexing mOptions).
+    @IntDef({Type.NEVER_LANGUAGE, Type.NEVER_DOMAIN, Type.ALWAYS_LANGUAGE})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface Type {
+        int NEVER_LANGUAGE = 0;
+        int NEVER_DOMAIN = 1;
+        int ALWAYS_LANGUAGE = 2;
+
+        int NUM_ENTRIES = 3;
+    }
 
     private String mSourceLanguageCode;
     private String mTargetLanguageCode;
@@ -90,16 +97,13 @@
             ArrayList<TranslateLanguageData> allLanguages, boolean neverLanguage,
             boolean neverDomain, boolean alwaysLanguage, boolean triggeredFromMenu,
             boolean[] originalOptions) {
-        mOptions = new boolean[3];
-        mOptions[NEVER_LANGUAGE] = neverLanguage;
-        mOptions[NEVER_DOMAIN] = neverDomain;
-        mOptions[ALWAYS_LANGUAGE] = alwaysLanguage;
+        assert Type.NUM_ENTRIES == 3;
+        mOptions = new boolean[Type.NUM_ENTRIES];
+        mOptions[Type.NEVER_LANGUAGE] = neverLanguage;
+        mOptions[Type.NEVER_DOMAIN] = neverDomain;
+        mOptions[Type.ALWAYS_LANGUAGE] = alwaysLanguage;
 
-        if (originalOptions == null) {
-            mOriginalOptions = mOptions.clone();
-        } else {
-            mOriginalOptions = originalOptions.clone();
-        }
+        mOriginalOptions = originalOptions == null ? mOptions.clone() : originalOptions.clone();
 
         mSourceLanguageCode = sourceLanguageCode;
         mTargetLanguageCode = targetLanguageCode;
@@ -126,11 +130,7 @@
 
         ArrayList<TranslateLanguageData> languageList = new ArrayList<TranslateLanguageData>();
         for (int i = 0; i < languages.length; ++i) {
-            Integer hashCode = null;
-            if (hashCodes != null) {
-                hashCode = Integer.valueOf(hashCodes[i]);
-            }
-
+            Integer hashCode = hashCodes != null ? Integer.valueOf(hashCodes[i]) : null;
             languageList.add(new TranslateLanguageData(codes[i], languages[i], hashCode));
         }
         return new TranslateOptions(sourceLanguageCode, targetLanguageCode, languageList, false,
@@ -142,8 +142,8 @@
      */
     TranslateOptions copy() {
         return new TranslateOptions(mSourceLanguageCode, mTargetLanguageCode, mAllLanguages,
-                mOptions[NEVER_LANGUAGE], mOptions[NEVER_DOMAIN], mOptions[ALWAYS_LANGUAGE],
-                mTriggeredFromMenu, mOriginalOptions);
+                mOptions[Type.NEVER_LANGUAGE], mOptions[Type.NEVER_DOMAIN],
+                mOptions[Type.ALWAYS_LANGUAGE], mTriggeredFromMenu, mOriginalOptions);
     }
 
     public String sourceLanguageName() {
@@ -169,40 +169,28 @@
     public boolean optionsChanged() {
         return (!mSourceLanguageCode.equals(mOriginalSourceLanguageCode))
                 || (!mTargetLanguageCode.equals(mOriginalTargetLanguageCode))
-                || (mOptions[NEVER_LANGUAGE] != mOriginalOptions[NEVER_LANGUAGE])
-                || (mOptions[NEVER_DOMAIN] != mOriginalOptions[NEVER_DOMAIN])
-                || (mOptions[ALWAYS_LANGUAGE] != mOriginalOptions[ALWAYS_LANGUAGE]);
+                || (mOptions[Type.NEVER_LANGUAGE] != mOriginalOptions[Type.NEVER_LANGUAGE])
+                || (mOptions[Type.NEVER_DOMAIN] != mOriginalOptions[Type.NEVER_DOMAIN])
+                || (mOptions[Type.ALWAYS_LANGUAGE] != mOriginalOptions[Type.ALWAYS_LANGUAGE]);
     }
 
     public List<TranslateLanguageData> allLanguages() {
         return mAllLanguages;
     }
 
-    public boolean neverTranslateLanguageState() {
-        return mOptions[NEVER_LANGUAGE];
-    }
-
-    public boolean alwaysTranslateLanguageState() {
-        return mOptions[ALWAYS_LANGUAGE];
-    }
-
-    public boolean neverTranslateDomainState() {
-        return mOptions[NEVER_DOMAIN];
+    public boolean getTranslateState(@Type int type) {
+        return mOptions[type];
     }
 
     public boolean setSourceLanguage(String languageCode) {
         boolean canSet = canSetLanguage(languageCode, mTargetLanguageCode);
-        if (canSet) {
-            mSourceLanguageCode = languageCode;
-        }
+        if (canSet) mSourceLanguageCode = languageCode;
         return canSet;
     }
 
     public boolean setTargetLanguage(String languageCode) {
         boolean canSet = canSetLanguage(mSourceLanguageCode, languageCode);
-        if (canSet) {
-            mTargetLanguageCode = languageCode;
-        }
+        if (canSet) mTargetLanguageCode = languageCode;
         return canSet;
     }
 
@@ -211,8 +199,8 @@
      *
      * @return true if the toggling was possible
      */
-    public boolean toggleNeverTranslateDomainState(boolean value) {
-        return toggleState(NEVER_DOMAIN, value);
+    public void toggleNeverTranslateDomainState(boolean value) {
+        mOptions[Type.NEVER_DOMAIN] = value;
     }
 
     /**
@@ -223,10 +211,9 @@
     public boolean toggleNeverTranslateLanguageState(boolean value) {
         // Do not toggle if we are activating NeverLanguge but AlwaysTranslate
         // for a language pair with the same source language is already active.
-        if (mOptions[ALWAYS_LANGUAGE] && value) {
-            return false;
-        }
-        return toggleState(NEVER_LANGUAGE, value);
+        if (mOptions[Type.ALWAYS_LANGUAGE] && value) return false;
+        mOptions[Type.NEVER_LANGUAGE] = value;
+        return true;
     }
 
     /**
@@ -236,10 +223,9 @@
      */
     public boolean toggleAlwaysTranslateLanguageState(boolean value) {
         // Do not toggle if we are activating AlwaysLanguge but NeverLanguage is active already.
-        if (mOptions[NEVER_LANGUAGE] && value) {
-            return false;
-        }
-        return toggleState(ALWAYS_LANGUAGE, value);
+        if (mOptions[Type.NEVER_LANGUAGE] && value) return false;
+        mOptions[Type.ALWAYS_LANGUAGE] = value;
+        return true;
     }
 
     /**
@@ -248,10 +234,7 @@
      * @return The translated representation of the language, or "" if not found.
      */
     public String getRepresentationFromCode(String languageCode) {
-        if (isValidLanguageCode(languageCode)) {
-            return mCodeToRepresentation.get(languageCode);
-        }
-        return "";
+        return isValidLanguageCode(languageCode) ? mCodeToRepresentation.get(languageCode) : "";
     }
 
     /**
@@ -260,17 +243,8 @@
      * @return The UMA hashcode representation of the language, or null if not found.
      */
     public Integer getUMAHashCodeFromCode(String languageCode) {
-        if (isValidLanguageUMAHashCode(languageCode)) {
-            return mCodeToUMAHashCode.get(languageCode);
-        }
-        return null;
-    }
-
-    private boolean toggleState(int element, boolean newValue) {
-        if (!checkElementBoundaries(element)) return false;
-
-        mOptions[element] = newValue;
-        return true;
+        return isValidLanguageUMAHashCode(languageCode) ? mCodeToUMAHashCode.get(languageCode)
+                                                        : null;
     }
 
     private boolean isValidLanguageCode(String languageCode) {
@@ -286,10 +260,6 @@
                 && !sourceCode.equals(targetCode);
     }
 
-    private static boolean checkElementBoundaries(int element) {
-        return element >= NEVER_LANGUAGE && element <= ALWAYS_LANGUAGE;
-    }
-
     @Override
     public String toString() {
         return new StringBuilder()
@@ -298,11 +268,11 @@
                 .append(targetLanguageCode())
                 .append(" - ")
                 .append("Never Language:")
-                .append(mOptions[NEVER_LANGUAGE])
+                .append(mOptions[Type.NEVER_LANGUAGE])
                 .append(" Always Language:")
-                .append(mOptions[ALWAYS_LANGUAGE])
+                .append(mOptions[Type.ALWAYS_LANGUAGE])
                 .append(" Never Domain:")
-                .append(mOptions[NEVER_DOMAIN])
+                .append(mOptions[Type.NEVER_DOMAIN])
                 .toString();
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java
index faee25c..ca104d9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/translate/TranslateMenuHelper.java
@@ -290,7 +290,7 @@
                     TintedImageView checkboxIcon =
                             (TintedImageView) menuItemView.findViewById(R.id.menu_item_icon);
                     if (getItem(position).mId == TranslateMenu.ID_OVERFLOW_ALWAYS_TRANSLATE
-                            && mOptions.alwaysTranslateLanguageState()) {
+                            && mOptions.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE)) {
                         checkboxIcon.setVisibility(View.VISIBLE);
                     } else {
                         checkboxIcon.setVisibility(View.INVISIBLE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
index 78ad9b23..d4bb6028 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/AsyncInitializationActivity.java
@@ -488,7 +488,6 @@
         mNativeInitializationController.onActivityResult(requestCode, resultCode, data);
     }
 
-    @CallSuper
     @Override
     public final void onCreateWithNative() {
         try {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
index ab53aaa..06f0f6c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
@@ -208,7 +208,7 @@
         mNotifications.put(notificationId, mediaType);
         updateSharedPreferencesEntry(notificationId, false);
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.MEDIA_CAPTURE, channelId);
+                NotificationUmaTracker.SystemNotificationType.MEDIA_CAPTURE, channelId);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
index c18c227..da74cecf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/MediaNotificationManager.java
@@ -783,7 +783,8 @@
         mService = service;
         updateNotification(true /*serviceStarting*/);
         mNotificationUmaTracker.onNotificationShown(
-                NotificationUmaTracker.MEDIA, ChannelDefinitions.CHANNEL_ID_MEDIA);
+                NotificationUmaTracker.SystemNotificationType.MEDIA,
+                ChannelDefinitions.CHANNEL_ID_MEDIA);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/OmniboxStartupMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/OmniboxStartupMetrics.java
new file mode 100644
index 0000000..75b3084
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/OmniboxStartupMetrics.java
@@ -0,0 +1,150 @@
+// 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.metrics;
+
+import android.os.SystemClock;
+import android.support.annotation.IntDef;
+
+import org.chromium.base.library_loader.LibraryProcessType;
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.chrome.browser.ChromeActivity;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
+import org.chromium.content_public.browser.BrowserStartupController;
+import org.chromium.content_public.browser.WebContents;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Tracks the startup state of chrome at the time of first url bar focus.
+ */
+public class OmniboxStartupMetrics {
+    // Used to record the UMA histogram MobileStartup.ToolbarFirstFocusStartupState.<activity name>.
+    // Since these values are persisted to logs, they should never be renumbered nor reused.
+    @IntDef({StartupState.PRE_NATIVE_INITIALIZATION, StartupState.POST_NATIVE_INITIALIZATION,
+            StartupState.POST_FIRST_MEANINGFUL_PAINT, StartupState.POST_FIRST_PAGELOAD_FINISHED})
+    public @interface StartupState {
+        // This is the state of startup before native has been loaded
+        int PRE_NATIVE_INITIALIZATION = 0;
+        // This is the state of startup after native has finished loaded but before the first
+        // meaningful paint.
+        int POST_NATIVE_INITIALIZATION = 1;
+        // This is after the first meaningful paint but before the first page finished loading
+        // completely
+        int POST_FIRST_MEANINGFUL_PAINT = 2;
+        // This is after the first page has been loaded completely.
+        int POST_FIRST_PAGELOAD_FINISHED = 3;
+
+        int COUNT = 4;
+    }
+
+    private static final int MIN_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS = 1000;
+    private static final int MAX_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS = 30000;
+
+    private final ChromeActivity mActivity;
+    private @StartupState int mCurrentStartupState = StartupState.PRE_NATIVE_INITIALIZATION;
+    // Startup state at the time the url bar is focused.
+    private @StartupState int mUrlBarFocusedStartupState;
+    // Track if the url bar has been focused since startup.
+    private long mUrlBarFirstFocusedTime = -1;
+    private TabModelSelectorTabObserver mTabModelSelectorTabObserver;
+    private PageLoadMetrics.Observer mPageLoadMetricsObserver;
+
+    public OmniboxStartupMetrics(ChromeActivity activity) {
+        mActivity = activity;
+        registerObservers();
+        BrowserStartupController.get(LibraryProcessType.PROCESS_BROWSER)
+                .addStartupCompletedObserver(new BrowserStartupController.StartupCallback() {
+                    @Override
+                    public void onSuccess() {
+                        onNativeLibraryLoaded();
+                    }
+
+                    @Override
+                    public void onFailure() {}
+                });
+    }
+
+    private void registerObservers() {
+        mTabModelSelectorTabObserver =
+                new TabModelSelectorTabObserver(mActivity.getTabModelSelector()) {
+                    @Override
+                    public void onPageLoadFinished(Tab tab) {
+                        updateStartupState(StartupState.POST_FIRST_PAGELOAD_FINISHED);
+                    }
+                };
+        mPageLoadMetricsObserver = new PageLoadMetrics.Observer() {
+            @Override
+            public void onFirstMeaningfulPaint(WebContents webContents, long navigationId,
+                    long navigationStartTick, long firstContentfulPaintMs) {
+                if (mActivity.getActivityTab() != null
+                        && mActivity.getActivityTab().getWebContents() != null
+                        && mActivity.getActivityTab().getWebContents().equals(webContents)) {
+                    updateStartupState(StartupState.POST_FIRST_MEANINGFUL_PAINT);
+                }
+            }
+        };
+        PageLoadMetrics.addObserver(mPageLoadMetricsObserver);
+    }
+
+    private void updateStartupState(@StartupState int newState) {
+        assert newState < StartupState.COUNT;
+        // Should not go backwards in startup state
+        if (newState < mCurrentStartupState) return;
+        mCurrentStartupState = newState;
+    }
+
+    /**
+     * Remove observers. This may be called multiple times (it is called when the histogram is
+     * recorded since we only record once per startup, but also on owner.destroy)
+     */
+    public void destroy() {
+        if (mTabModelSelectorTabObserver != null) {
+            mTabModelSelectorTabObserver.destroy();
+            mTabModelSelectorTabObserver = null;
+        }
+
+        if (mPageLoadMetricsObserver != null) {
+            PageLoadMetrics.removeObserver(mPageLoadMetricsObserver);
+            mPageLoadMetricsObserver = null;
+        }
+    }
+
+    /**
+     * Called when the url bar is focused, all calls after the first are ignored.
+     */
+    public void onUrlBarFocused() {
+        if (mUrlBarFirstFocusedTime == -1) {
+            mUrlBarFocusedStartupState = mCurrentStartupState;
+            mUrlBarFirstFocusedTime = SystemClock.elapsedRealtime();
+        }
+    }
+
+    /**
+     * Called when the native library is loaded.
+     */
+    private void onNativeLibraryLoaded() {
+        updateStartupState(StartupState.POST_NATIVE_INITIALIZATION);
+    }
+
+    /**
+     * Called outside the critical path to record the actual UMA histogram.
+     */
+    public void recordHistogram() {
+        if (mUrlBarFirstFocusedTime != -1) {
+            String activityName = mActivity.getClass().getSimpleName();
+            RecordHistogram.recordEnumeratedHistogram(
+                    "MobileStartup.ToolbarFirstFocusStartupState." + activityName,
+                    mUrlBarFocusedStartupState, StartupState.COUNT);
+
+            RecordHistogram.recordCustomTimesHistogram(
+                    "MobileStartup.ToolbarFirstFocusTime2." + activityName,
+                    mUrlBarFirstFocusedTime - mActivity.getOnCreateTimestampMs(),
+                    MIN_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS, MAX_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS,
+                    TimeUnit.MILLISECONDS, 50);
+        }
+        destroy();
+    }
+}
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
index a3eaf51..3a6d8ba 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
@@ -624,15 +624,14 @@
 
             mNotificationManager.notify(notificationId, PLATFORM_ID, notificationBuilder.build());
             NotificationUmaTracker.getInstance().onNotificationShown(
-                    NotificationUmaTracker.SITES, notificationBuilder.mChannelId);
+                    NotificationUmaTracker.SystemNotificationType.SITES,
+                    notificationBuilder.mChannelId);
         }
     }
 
     private NotificationBuilderBase createNotificationBuilder(Context context, boolean hasImage) {
-        if (useCustomLayouts(hasImage)) {
-            return new CustomNotificationBuilder(context);
-        }
-        return new StandardNotificationBuilder(context);
+        return useCustomLayouts(hasImage) ? new CustomNotificationBuilder(context)
+                                          : new StandardNotificationBuilder(context);
     }
 
     /** Returns whether to set a channel id when building a notification. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
index d6830b5..0b7ae37 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
@@ -26,11 +26,6 @@
  */
 public class NotificationUmaTracker {
     private static final String TAG = "NotifsUMATracker";
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({DOWNLOAD_FILES, DOWNLOAD_PAGES, CLOSE_INCOGNITO, CONTENT_SUGGESTION, MEDIA_CAPTURE,
-            PHYSICAL_WEB, MEDIA, SITES, SYNC, WEBAPK, BROWSER_ACTIONS, WEBAPP_ACTIONS,
-            SYSTEM_NOTIFICATION_TYPE_BOUNDARY, OFFLINE_CONTENT_SUGGESTION})
-    public @interface SystemNotificationType {}
 
     /*
      * A list of notification types.  To add a type to this list please update
@@ -39,24 +34,34 @@
      *
      * A SystemNotificationType value can also be saved in shared preferences.
      */
-    public static final int DOWNLOAD_FILES = 0;
+    @IntDef({SystemNotificationType.DOWNLOAD_FILES, SystemNotificationType.DOWNLOAD_PAGES,
+            SystemNotificationType.CLOSE_INCOGNITO, SystemNotificationType.CONTENT_SUGGESTION,
+            SystemNotificationType.MEDIA_CAPTURE, SystemNotificationType.PHYSICAL_WEB,
+            SystemNotificationType.MEDIA, SystemNotificationType.SITES, SystemNotificationType.SYNC,
+            SystemNotificationType.WEBAPK, SystemNotificationType.BROWSER_ACTIONS,
+            SystemNotificationType.WEBAPP_ACTIONS,
+            SystemNotificationType.OFFLINE_CONTENT_SUGGESTION})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface SystemNotificationType {
+        int DOWNLOAD_FILES = 0;
 
-    public static final int DOWNLOAD_PAGES = 1;
+        int DOWNLOAD_PAGES = 1;
 
-    public static final int CLOSE_INCOGNITO = 2;
+        int CLOSE_INCOGNITO = 2;
 
-    public static final int CONTENT_SUGGESTION = 3;
-    public static final int MEDIA_CAPTURE = 4;
-    public static final int PHYSICAL_WEB = 5;
-    public static final int MEDIA = 6;
-    public static final int SITES = 7;
-    public static final int SYNC = 8;
-    public static final int WEBAPK = 9;
-    public static final int BROWSER_ACTIONS = 10;
-    public static final int WEBAPP_ACTIONS = 11;
-    public static final int OFFLINE_CONTENT_SUGGESTION = 12;
+        int CONTENT_SUGGESTION = 3;
+        int MEDIA_CAPTURE = 4;
+        int PHYSICAL_WEB = 5;
+        int MEDIA = 6;
+        int SITES = 7;
+        int SYNC = 8;
+        int WEBAPK = 9;
+        int BROWSER_ACTIONS = 10;
+        int WEBAPP_ACTIONS = 11;
+        int OFFLINE_CONTENT_SUGGESTION = 12;
 
-    private static final int SYSTEM_NOTIFICATION_TYPE_BOUNDARY = 13;
+        int NUM_ENTRIES = 13;
+    }
 
     private static final String LAST_SHOWN_NOTIFICATION_TYPE_KEY =
             "NotificationUmaTracker.LastShownNotificationType";
@@ -125,6 +130,6 @@
 
     private static void recordHistogram(String name, @SystemNotificationType int type) {
         if (!LibraryLoader.getInstance().isInitialized()) return;
-        RecordHistogram.recordEnumeratedHistogram(name, type, SYSTEM_NOTIFICATION_TYPE_BOUNDARY);
+        RecordHistogram.recordEnumeratedHistogram(name, type, SystemNotificationType.NUM_ENTRIES);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotifier.java
index c8955c3..a29ec7c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/ContentSuggestionsNotifier.java
@@ -193,12 +193,10 @@
             builder.addAction(R.drawable.settings_cog, context.getString(R.string.preferences),
                     settingsIntent);
         }
-        if (priority >= 0) {
-            builder.setDefaults(Notification.DEFAULT_ALL);
-        }
+        if (priority >= 0) builder.setDefaults(Notification.DEFAULT_ALL);
         manager.notify(NOTIFICATION_TAG, nextId, builder.build());
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.CONTENT_SUGGESTION,
+                NotificationUmaTracker.SystemNotificationType.CONTENT_SUGGESTION,
                 ChannelDefinitions.CHANNEL_ID_CONTENT_SUGGESTIONS);
         addActiveNotification(new ActiveNotification(nextId, category, idWithinCategory, uri));
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java
index f5ac111c..79cf5a319 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchedPagesNotifier.java
@@ -45,9 +45,7 @@
     private static PrefetchedPagesNotifier sInstance;
 
     public static PrefetchedPagesNotifier getInstance() {
-        if (sInstance == null) {
-            sInstance = new PrefetchedPagesNotifier();
-        }
+        if (sInstance == null) sInstance = new PrefetchedPagesNotifier();
         return sInstance;
     }
 
@@ -140,7 +138,7 @@
         // Metrics tracking
         recordNotificationAction(NOTIFICATION_ACTION_SHOWN);
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.OFFLINE_CONTENT_SUGGESTION,
+                NotificationUmaTracker.SystemNotificationType.OFFLINE_CONTENT_SUGGESTION,
                 ChannelDefinitions.CHANNEL_ID_CONTENT_SUGGESTIONS);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java
index 685feca..05e23b9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBar.java
@@ -140,11 +140,6 @@
     void revertChanges();
 
     /**
-     * @return The timestamp for the {@link UrlBar} gaining focus for the first time.
-     */
-    long getFirstUrlBarFocusTime();
-
-    /**
      * Updates the security icon displayed in the LocationBar.
      */
     void updateSecurityIcon();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index 7d2ce339..122fa776 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -715,11 +715,6 @@
         }
     }
 
-    @Override
-    public long getFirstUrlBarFocusTime() {
-        return mUrlBar.getFirstFocusTime();
-    }
-
     /**
      * @return Whether the URL focus change is taking place, e.g. a focus animation is running on
      *         a phone device.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
index f1151cf0..fc7ebe7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -14,7 +14,6 @@
 import android.net.Uri;
 import android.os.Build;
 import android.os.StrictMode;
-import android.os.SystemClock;
 import android.support.annotation.IntDef;
 import android.support.annotation.Nullable;
 import android.support.v4.text.BidiFormatter;
@@ -114,8 +113,6 @@
 
     private Boolean mUseDarkColors;
 
-    private long mFirstFocusTimeMs;
-
     // Used as a hint to indicate the text may contain an ellipsize span.  This will be true if an
     // ellispize span was applied the last time the text changed.  A true value here does not
     // guarantee that the text does contain the span currently as newly set text may have cleared
@@ -347,10 +344,6 @@
         mFocused = focused;
         super.onFocusChanged(focused, direction, previouslyFocusedRect);
 
-        if (focused && mFirstFocusTimeMs == 0) {
-            mFirstFocusTimeMs = SystemClock.elapsedRealtime();
-        }
-
         if (focused) {
             mPendingScroll = false;
         }
@@ -359,14 +352,6 @@
     }
 
     /**
-     * @return The elapsed realtime timestamp in ms of the first time the url bar was focused,
-     *         0 if never.
-     */
-    public long getFirstFocusTime() {
-        return mFirstFocusTimeMs;
-    }
-
-    /**
      * Sets whether this {@link UrlBar} should be focusable.
      */
     public void setAllowFocus(boolean allowFocus) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java
index b651fa05..b82d68a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/page_info/PageInfoController.java
@@ -581,13 +581,13 @@
     @Override
     public void onDismiss() {
         assert mNativePageInfoController != 0;
-        mWebContentsObserver.destroy();
-        nativeDestroy(mNativePageInfoController);
-        mNativePageInfoController = 0;
         if (mPendingRunAfterDismissTask != null) {
             mPendingRunAfterDismissTask.run();
             mPendingRunAfterDismissTask = null;
         }
+        mWebContentsObserver.destroy();
+        nativeDestroy(mNativePageInfoController);
+        mNativePageInfoController = 0;
     }
 
     private void recordAction(int action) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
index f1125141..6e51f5cf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncNotificationController.java
@@ -120,7 +120,8 @@
 
         mNotificationManager.notify(NotificationConstants.NOTIFICATION_ID_SYNC, notification);
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.SYNC, ChannelDefinitions.CHANNEL_ID_BROWSER);
+                NotificationUmaTracker.SystemNotificationType.SYNC,
+                ChannelDefinitions.CHANNEL_ID_BROWSER);
     }
 
     private boolean shouldSyncAuthErrorBeShown() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
index c51bb0e..26fe6b2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateImpl.java
@@ -35,8 +35,8 @@
     private final Tab mTab;
     private final ExternalNavigationHandler mExternalNavHandler;
     private final AuthenticatorNavigationInterceptor mAuthenticatorHelper;
-    private ExternalNavigationHandler.OverrideUrlLoadingResult mLastOverrideUrlLoadingResult =
-            ExternalNavigationHandler.OverrideUrlLoadingResult.NO_OVERRIDE;
+    private @OverrideUrlLoadingResult int mLastOverrideUrlLoadingResult =
+            OverrideUrlLoadingResult.NO_OVERRIDE;
 
     /**
      * Whether forward history should be cleared after navigation is committed.
@@ -83,7 +83,7 @@
     }
 
     @VisibleForTesting
-    public OverrideUrlLoadingResult getLastOverrideUrlLoadingResultForTests() {
+    public @OverrideUrlLoadingResult int getLastOverrideUrlLoadingResultForTests() {
         return mLastOverrideUrlLoadingResult;
     }
 
@@ -126,27 +126,26 @@
         ExternalNavigationParams params = buildExternalNavigationParams(navigationParams,
                 tabRedirectHandler,
                 shouldCloseTab).build();
-        OverrideUrlLoadingResult result = mExternalNavHandler.shouldOverrideUrlLoading(params);
+        @OverrideUrlLoadingResult
+        int result = mExternalNavHandler.shouldOverrideUrlLoading(params);
         mLastOverrideUrlLoadingResult = result;
 
-        RecordHistogram.recordEnumeratedHistogram("Android.TabNavigationInterceptResult",
-                result.ordinal(), OverrideUrlLoadingResult.values().length);
+        RecordHistogram.recordEnumeratedHistogram("Android.TabNavigationInterceptResult", result,
+                OverrideUrlLoadingResult.NUM_ENTRIES);
         switch (result) {
-            case OVERRIDE_WITH_EXTERNAL_INTENT:
+            case OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT:
                 assert mExternalNavHandler.canExternalAppHandleUrl(url);
-                if (navigationParams.isMainFrame) {
-                    onOverrideUrlLoadingAndLaunchIntent();
-                }
+                if (navigationParams.isMainFrame) onOverrideUrlLoadingAndLaunchIntent();
                 return true;
-            case OVERRIDE_WITH_CLOBBERING_TAB:
+            case OverrideUrlLoadingResult.OVERRIDE_WITH_CLOBBERING_TAB:
                 mShouldClearRedirectHistoryForTabClobbering = true;
                 return true;
-            case OVERRIDE_WITH_ASYNC_ACTION:
+            case OverrideUrlLoadingResult.OVERRIDE_WITH_ASYNC_ACTION:
                 if (!shouldCloseTab && navigationParams.isMainFrame) {
                     onOverrideUrlLoadingAndLaunchIntent();
                 }
                 return true;
-            case NO_OVERRIDE:
+            case OverrideUrlLoadingResult.NO_OVERRIDE:
             default:
                 if (navigationParams.isExternalProtocol) {
                     logBlockedNavigationToDevToolsConsole(url);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
index dfb33ee..0ba655b9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/CustomTabToolbar.java
@@ -758,11 +758,6 @@
     public void revertChanges() {}
 
     @Override
-    public long getFirstUrlBarFocusTime() {
-        return 0;
-    }
-
-    @Override
     public void hideSuggestions() {}
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
index 83b739d..17174a86 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -47,6 +47,7 @@
 import org.chromium.chrome.browser.fullscreen.BrowserStateBrowserControlsVisibilityDelegate;
 import org.chromium.chrome.browser.fullscreen.FullscreenManager;
 import org.chromium.chrome.browser.fullscreen.FullscreenOptions;
+import org.chromium.chrome.browser.metrics.OmniboxStartupMetrics;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
 import org.chromium.chrome.browser.ntp.IncognitoNewTabPage;
 import org.chromium.chrome.browser.ntp.NativePageFactory;
@@ -116,9 +117,6 @@
      */
     private static final int RECORD_UMA_PERFORMANCE_METRICS_DELAY_MS = 30000;
 
-    private static final int MIN_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS = 1000;
-    private static final int MAX_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS = 30000;
-
     /**
      * The minimum load progress that can be shown when a page is loading.  This is not 0 so that
      * it's obvious to the user that something is attempting to load.
@@ -182,6 +180,8 @@
     private boolean mShouldUpdateToolbarPrimaryColor = true;
     private int mCurrentThemeColor;
 
+    private OmniboxStartupMetrics mOmniboxStartupMetrics;
+
     /**
      * Creates a ToolbarManager object.
      *
@@ -239,6 +239,8 @@
 
         HomepageManager.getInstance().addListener(mHomepageStateListener);
 
+        mOmniboxStartupMetrics = new OmniboxStartupMetrics(activity);
+
         mTabModelSelectorObserver = new EmptyTabModelSelectorObserver() {
             @Override
             public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
@@ -879,6 +881,11 @@
             mBottomToolbarCoordinator = null;
         }
 
+        if (mOmniboxStartupMetrics != null) {
+            mOmniboxStartupMetrics.destroy();
+            mOmniboxStartupMetrics = null;
+        }
+
         mLocationBar.removeUrlFocusChangeListener(this);
         Tab currentTab = mToolbarModel.getTab();
         if (currentTab != null) currentTab.removeObserver(mTabObserver);
@@ -1103,6 +1110,7 @@
         if (hasFocus) {
             mFullscreenFocusToken = mControlsVisibilityDelegate
                     .showControlsPersistentAndClearOldToken(mFullscreenFocusToken);
+            mOmniboxStartupMetrics.onUrlBarFocused();
         } else {
             mControlsVisibilityDelegate.hideControlsPersistent(mFullscreenFocusToken);
             mFullscreenFocusToken = FullscreenManager.INVALID_TOKEN;
@@ -1221,14 +1229,7 @@
         }
         RecordHistogram.recordTimesHistogram("MobileStartup.ToolbarFirstDrawTime2." + activityName,
                 mToolbar.getFirstDrawTime() - activityCreationTimeMs, TimeUnit.MILLISECONDS);
-
-        long firstFocusTime = mToolbar.getLocationBar().getFirstUrlBarFocusTime();
-        if (firstFocusTime != 0) {
-            RecordHistogram.recordCustomTimesHistogram(
-                    "MobileStartup.ToolbarFirstFocusTime2." + activityName,
-                    firstFocusTime - activityCreationTimeMs, MIN_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS,
-                    MAX_FOCUS_TIME_FOR_UMA_HISTOGRAM_MS, TimeUnit.MILLISECONDS, 50);
-        }
+        mOmniboxStartupMetrics.recordHistogram();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkDisclosureNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkDisclosureNotificationManager.java
index 169c3bc..cce8a004 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkDisclosureNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkDisclosureNotificationManager.java
@@ -80,7 +80,8 @@
         nm.notify(DISMISSAL_NOTIFICATION_TAG_PREFIX + webappInfo.apkPackageName(), PLATFORM_ID,
                 builder.build());
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.WEBAPK, ChannelDefinitions.CHANNEL_ID_BROWSER);
+                NotificationUmaTracker.SystemNotificationType.WEBAPK,
+                ChannelDefinitions.CHANNEL_ID_BROWSER);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationManager.java
index 969768b..fd9ebe2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActionsNotificationManager.java
@@ -61,7 +61,7 @@
                 Context.NOTIFICATION_SERVICE);
         nm.notify(NotificationConstants.NOTIFICATION_ID_WEBAPP_ACTIONS, createNotification());
         NotificationUmaTracker.getInstance().onNotificationShown(
-                NotificationUmaTracker.WEBAPP_ACTIONS,
+                NotificationUmaTracker.SystemNotificationType.WEBAPP_ACTIONS,
                 ChannelDefinitions.CHANNEL_ID_WEBAPP_ACTIONS);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
index 2db42a5..d077344d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -10,6 +10,7 @@
 import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.Color;
+import android.graphics.PixelFormat;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Build;
@@ -271,6 +272,15 @@
 
     @Override
     protected void doLayoutInflation() {
+        // Because we delay the layout inflation, the CompositorSurfaceManager and its
+        // SurfaceView(s) are created and attached late (ie after the first draw). At the time of
+        // the first attach of a SurfaceView to the view hierarchy (regardless of the SurfaceView's
+        // actual opacity), the window transparency hint changes (because the window creates a
+        // transparent hole and attaches the SurfaceView to that hole). This may cause older android
+        // versions to destroy the window and redraw it causing a flicker. This line sets the window
+        // transparency hint early so that when the SurfaceView gets attached later, the
+        // transparency hint need not change and no flickering occurs.
+        getWindow().setFormat(PixelFormat.TRANSLUCENT);
         // No need to inflate layout synchronously since splash screen is displayed.
         new Thread() {
             @Override
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index eb2458c..da48bc30 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -759,6 +759,7 @@
   "java/src/org/chromium/chrome/browser/metrics/MainIntentBehaviorMetrics.java",
   "java/src/org/chromium/chrome/browser/metrics/MediaSessionUMA.java",
   "java/src/org/chromium/chrome/browser/metrics/MediaNotificationUma.java",
+  "java/src/org/chromium/chrome/browser/metrics/OmniboxStartupMetrics.java",
   "java/src/org/chromium/chrome/browser/metrics/OneShotImpressionListener.java",
   "java/src/org/chromium/chrome/browser/metrics/PackageMetrics.java",
   "java/src/org/chromium/chrome/browser/metrics/PageLoadMetrics.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabExternalNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabExternalNavigationTest.java
index 1645ae3..2169817f5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabExternalNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabExternalNavigationTest.java
@@ -99,7 +99,8 @@
         final String testUrl = "customtab://customtabtest/intent";
         ExternalNavigationParams params = new ExternalNavigationParams.Builder(testUrl, false)
                 .build();
-        OverrideUrlLoadingResult result = mUrlHandler.shouldOverrideUrlLoading(params);
+        @OverrideUrlLoadingResult
+        int result = mUrlHandler.shouldOverrideUrlLoading(params);
         Assert.assertEquals(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, result);
         Assert.assertTrue("A dummy activity should have been started to handle the special url.",
                 mNavigationDelegate.hasExternalActivityStarted());
@@ -115,7 +116,8 @@
         final String testUrl = "http://customtabtest.com";
         ExternalNavigationParams params = new ExternalNavigationParams.Builder(testUrl, false)
                 .build();
-        OverrideUrlLoadingResult result = mUrlHandler.shouldOverrideUrlLoading(params);
+        @OverrideUrlLoadingResult
+        int result = mUrlHandler.shouldOverrideUrlLoading(params);
         Assert.assertEquals(OverrideUrlLoadingResult.NO_OVERRIDE, result);
         Assert.assertFalse("External activities should not be started to handle the url",
                 mNavigationDelegate.hasExternalActivityStarted());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java
index 22d2a591..197d213 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabFromChromeExternalNavigationTest.java
@@ -151,10 +151,9 @@
         });
 
         CriteriaHelper.pollUiThread(Criteria.equals(
-                OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT,
-                new Callable<OverrideUrlLoadingResult>() {
+                OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, new Callable<Integer>() {
                     @Override
-                    public OverrideUrlLoadingResult call() throws Exception {
+                    public @OverrideUrlLoadingResult Integer call() throws Exception {
                         return navigationDelegate.get().getLastOverrideUrlLoadingResultForTests();
                     }
                 }));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java
index ab898a3..8d5e1d7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/ExternalNavigationHandlerTest.java
@@ -1033,7 +1033,8 @@
                 new ExternalNavigationParams.Builder(YOUTUBE_MOBILE_URL, false)
                         .setOpenInNewTab(true)
                         .build();
-        OverrideUrlLoadingResult result = mUrlHandler.shouldOverrideUrlLoading(params);
+        @OverrideUrlLoadingResult
+        int result = mUrlHandler.shouldOverrideUrlLoading(params);
         Assert.assertEquals(OverrideUrlLoadingResult.OVERRIDE_WITH_EXTERNAL_INTENT, result);
         Assert.assertTrue(mDelegate.startActivityIntent != null);
         Assert.assertTrue(
@@ -1581,7 +1582,7 @@
         }
 
         @Override
-        public OverrideUrlLoadingResult clobberCurrentTab(String url, String referrerUrl) {
+        public @OverrideUrlLoadingResult int clobberCurrentTab(String url, String referrerUrl) {
             mNewUrlAfterClobbering = url;
             mReferrerUrlForClobbering = referrerUrl;
             return OverrideUrlLoadingResult.OVERRIDE_WITH_CLOBBERING_TAB;
@@ -1759,8 +1760,8 @@
             return this;
         }
 
-        public void expecting(OverrideUrlLoadingResult expectedOverrideResult,
-                int otherExpectation) {
+        public void expecting(
+                @OverrideUrlLoadingResult int expectedOverrideResult, int otherExpectation) {
             boolean expectStartIncognito = (otherExpectation & START_INCOGNITO) != 0;
             boolean expectStartActivity =
                     (otherExpectation & (START_WEBAPK | START_OTHER_ACTIVITY)) != 0;
@@ -1784,7 +1785,8 @@
                             .setNativeClientPackageName(mDelegate.getReferrerWebappPackageName())
                             .setHasUserGesture(mHasUserGesture)
                             .build();
-            OverrideUrlLoadingResult result = mUrlHandler.shouldOverrideUrlLoading(params);
+            @OverrideUrlLoadingResult
+            int result = mUrlHandler.shouldOverrideUrlLoading(params);
             boolean startActivityCalled = false;
             boolean startWebApkCalled = false;
             if (mDelegate.startActivityIntent != null) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
index edc69059..076a2d8f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
@@ -89,7 +89,8 @@
         }
 
         @Override
-        public OverrideUrlLoadingResult shouldOverrideUrlLoading(ExternalNavigationParams params) {
+        public @OverrideUrlLoadingResult int shouldOverrideUrlLoading(
+                ExternalNavigationParams params) {
             mExternalNavParamHistory.add(params);
             return OverrideUrlLoadingResult.NO_OVERRIDE;
         }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateOptionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateOptionsTest.java
index 8e7a20a..1f792673 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateOptionsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateOptionsTest.java
@@ -38,9 +38,9 @@
         Assert.assertEquals("Spanish", options.targetLanguageName());
         Assert.assertEquals("en", options.sourceLanguageCode());
         Assert.assertEquals("es", options.targetLanguageCode());
-        Assert.assertFalse(options.neverTranslateLanguageState());
-        Assert.assertTrue(options.alwaysTranslateLanguageState());
-        Assert.assertFalse(options.neverTranslateDomainState());
+        Assert.assertFalse(options.getTranslateState(TranslateOptions.Type.NEVER_LANGUAGE));
+        Assert.assertTrue(options.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE));
+        Assert.assertFalse(options.getTranslateState(TranslateOptions.Type.NEVER_DOMAIN));
         Assert.assertFalse(options.optionsChanged());
         Assert.assertNull(options.getUMAHashCodeFromCode("en"));
     }
@@ -101,21 +101,21 @@
                 "en", "es", LANGUAGES, CODES, !ALWAYS_TRANSLATE, false, null);
         Assert.assertFalse(options.optionsChanged());
         options.toggleNeverTranslateDomainState(true);
-        Assert.assertTrue(options.neverTranslateDomainState());
-        Assert.assertFalse(options.alwaysTranslateLanguageState());
-        Assert.assertFalse(options.neverTranslateLanguageState());
+        Assert.assertTrue(options.getTranslateState(TranslateOptions.Type.NEVER_DOMAIN));
+        Assert.assertFalse(options.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE));
+        Assert.assertFalse(options.getTranslateState(TranslateOptions.Type.NEVER_LANGUAGE));
         Assert.assertTrue(options.optionsChanged());
         options.toggleNeverTranslateDomainState(false);
-        Assert.assertFalse(options.neverTranslateDomainState());
-        Assert.assertFalse(options.neverTranslateLanguageState());
-        Assert.assertFalse(options.alwaysTranslateLanguageState());
+        Assert.assertFalse(options.getTranslateState(TranslateOptions.Type.NEVER_DOMAIN));
+        Assert.assertFalse(options.getTranslateState(TranslateOptions.Type.NEVER_LANGUAGE));
+        Assert.assertFalse(options.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE));
 
         // We are back to the original state
         Assert.assertFalse(options.optionsChanged());
         options.toggleAlwaysTranslateLanguageState(true);
-        Assert.assertFalse(options.neverTranslateDomainState());
-        Assert.assertFalse(options.neverTranslateLanguageState());
-        Assert.assertTrue(options.alwaysTranslateLanguageState());
+        Assert.assertFalse(options.getTranslateState(TranslateOptions.Type.NEVER_DOMAIN));
+        Assert.assertFalse(options.getTranslateState(TranslateOptions.Type.NEVER_LANGUAGE));
+        Assert.assertTrue(options.getTranslateState(TranslateOptions.Type.ALWAYS_LANGUAGE));
         Assert.assertTrue(options.optionsChanged());
     }
 
@@ -129,14 +129,14 @@
         // Never translate language should not work, but never translate domain
         // should
         Assert.assertFalse(options.toggleNeverTranslateLanguageState(true));
-        Assert.assertTrue(options.toggleNeverTranslateDomainState(true));
+        options.toggleNeverTranslateDomainState(true);
         Assert.assertTrue(options.optionsChanged());
 
         Assert.assertTrue(options.toggleAlwaysTranslateLanguageState(false));
 
         // Never options are ok
         Assert.assertTrue(options.toggleNeverTranslateLanguageState(true));
-        Assert.assertTrue(options.toggleNeverTranslateDomainState(true));
+        options.toggleNeverTranslateDomainState(true);
 
         // But always is not now
         Assert.assertFalse(options.toggleAlwaysTranslateLanguageState(true));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerServiceLifecycleTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerServiceLifecycleTest.java
index 7107b71a..bdda08f 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerServiceLifecycleTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerServiceLifecycleTest.java
@@ -199,8 +199,8 @@
         order.verify(getManager(), times(1)).onServiceStarted(mService);
         order.verify(getManager(), times(1)).updateNotification(anyBoolean());
         verify(mMockUmaTracker)
-                .onNotificationShown(
-                        NotificationUmaTracker.MEDIA, ChannelDefinitions.CHANNEL_ID_MEDIA);
+                .onNotificationShown(NotificationUmaTracker.SystemNotificationType.MEDIA,
+                        ChannelDefinitions.CHANNEL_ID_MEDIA);
     }
 
     @Test
diff --git a/chrome/app/settings_chromium_strings.grdp b/chrome/app/settings_chromium_strings.grdp
index 100f7a74..205a71e 100644
--- a/chrome/app/settings_chromium_strings.grdp
+++ b/chrome/app/settings_chromium_strings.grdp
@@ -56,8 +56,11 @@
   <message name="IDS_SETTINGS_IMPROVE_BROWSING_EXPERIENCE" desc="The text in the options panel that describes how we use web services to improve browsing experience.">
     Chromium may use web services to improve your browsing experience. You may optionally disable these services. <ph name="BEGIN_LINK">&lt;a target="_blank" href="$1"&gt;</ph>Learn more<ph name="END_LINK">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
-  <message name="IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING" desc="The section title of the 'Sends some system information and page content to Google to help detect dangerous apps and sites' checkbox">
-    Help improve Chromium security
+  <message name="IDS_SETTINGS_SPELLING_DESCRIPTION_UNIFIED_CONSENT" desc="Description of using a web serviced to help resolve spelling errors. It is important to convey that what the user types will be sent to Google.">
+    To fix spelling errors, Chromium sends the text you type in text fields to Google
+  </message>
+  <message name="IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_DESC" desc="Brief explanation of the capability of Google services.">
+    Communicates with Google to improve browsing and Chromium
   </message>
 
   <!-- People Page -->
diff --git a/chrome/app/settings_google_chrome_strings.grdp b/chrome/app/settings_google_chrome_strings.grdp
index 70f5da2..cde49d3 100644
--- a/chrome/app/settings_google_chrome_strings.grdp
+++ b/chrome/app/settings_google_chrome_strings.grdp
@@ -56,8 +56,11 @@
   <message name="IDS_SETTINGS_IMPROVE_BROWSING_EXPERIENCE" desc="The text in the options panel that describes how we use web services to improve browsing experience.">
     Google Chrome may use web services to improve your browsing experience. You may optionally disable these services. <ph name="BEGIN_LINK">&lt;a target="_blank" href="$1"&gt;</ph>Learn more<ph name="END_LINK">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
   </message>
-  <message name="IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING" desc="The section title of the 'Sends some system information and page content to Google to help detect dangerous apps and sites' checkbox">
-    Help improve Chrome security
+  <message name="IDS_SETTINGS_SPELLING_DESCRIPTION_UNIFIED_CONSENT" desc="Description of using a web serviced to help resolve spelling errors. It is important to convey that what the user types will be sent to Google.">
+    To fix spelling errors, Chrome sends the text you type in text fields to Google
+  </message>
+  <message name="IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_DESC" desc="Brief explanation of the capability of Google services.">
+    Communicates with Google to improve browsing and Chrome
   </message>
 
   <!-- People Page -->
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index ad35d19..07612320 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -2417,8 +2417,11 @@
   <message name="IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION_DESC" desc="Checkbox label: should Chrome protect user and user's device from dangerous sites">
     Protects you and your device from dangerous sites
   </message>
-  <message name="IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING_DESC" desc="Checkbox label: should Chrome upload some system information and page content to detect dangerous apps and sites">
-    Sends some system information and page content to Google to help detect dangerous apps and sites
+  <message name="IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING" desc="The section title of the extended safe browsing checkbox to help improve safe browsing">
+    Help improve Safe Browsing
+  </message>
+  <message name="IDS_SETTINGS_SAFEBROWSING_ENABLE_REPORTING_DESC" desc="Description for extended safe browsing">
+    Sends some system information and page content to Google
   </message>
   <message name="IDS_SETTINGS_SPELLING_PREF" desc="The documentation string of the 'Use Spelling' preference">
     Use a web service to help resolve spelling errors
@@ -2427,10 +2430,7 @@
     Smarter spell-checking by sending what you type in the browser to Google
   </message>
   <message name="IDS_SETTINGS_SPELLING_PREF_UNIFIED_CONSENT" desc="The documentation string of the 'Use Spelling' preference">
-    Spell check
-  </message>
-  <message name="IDS_SETTINGS_SPELLING_DESCRIPTION_UNIFIED_CONSENT" desc="Description of using a web serviced to help resolve spelling errors. It is important to convey that what the user types will be sent to Google.">
-    Control this setting in <ph name="BEGIN_LINK">&lt;a href=&quot;chrome://settings/languages&quot;&gt;<ex>&lt;a href=&quot;chrome://settings/languages&quot;&gt;</ex></ph>Languages<ph name="END_LINK">&lt;/a&gt;<ex>&lt;/a&gt;</ex></ph>
+    Enhanced spell check
   </message>
   <message name="IDS_SETTINGS_ENABLE_LOGGING" desc="The label of the checkbox to enable/disable crash and user metrics logging">
     Automatically send usage statistics and crash reports to Google
@@ -2442,7 +2442,13 @@
     Help improve Chrome's features and performance
   </message>
   <message name="IDS_SETTINGS_ENABLE_LOGGING_DESC_UNIFIED_CONSENT" desc="The description of the checkbox to enable/disable crash and user metrics logging">
-    Automatically sends usage statistics and crash reports to Google
+    Automatically send usage statistics and crash reports to Google
+  </message>
+  <message name="IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION" desc="The label of the checkbox to enable/disable url keyed anonymized data collection.">
+    Make searches and browsing better
+  </message>
+  <message name="IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC" desc="The description of the checkbox to enable/disable url keyed anonymized data collection.">
+    Sends URLs of pages you visit to Google
   </message>
   <message name="IDS_SETTINGS_ENABLE_DO_NOT_TRACK" desc="The label of the checkbox to enable/disable sending the 'Do Not track' header">
     Send a "Do Not Track" request with your browsing traffic
@@ -3464,7 +3470,7 @@
     Passwords, bookmarks, history, and more are synced to your account
   </message>
   <message name="IDS_SETTINGS_SYNC_DESCRIPTION_UNIFIED_CONSENT" desc="Text explaining what the sync system does, when unified consent is enabled.">
-    Your browsing data and activity, synced to your Google account.
+    Your browsing data and activity, synced to your Google Account
   </message>
   <message name="IDS_SETTINGS_SYNC_SECTION_ACCESSIBILITY_LABEL" desc="Label for the button that toggles showing the sync settings. Only visible by screen reader software.">
     Show sync settings
@@ -3472,9 +3478,6 @@
   <message name="IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_LABEL" desc="Title for a section that shows options for various Google services">
     Non-personalized services
   </message>
-  <message name="IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_DESC" desc="Brief explanation of the capability of Google services.">
-    Communicate with Google to improve browsing and Chrome
-  </message>
   <message name="IDS_SETTINGS_NON_PERSONALIZED_SERVICES_SECTION_ACCESSIBILITY_LABEL" desc="Label for the button that toggles showing the google services settings. Only visible by screen reader software.">
     Show Google services settings
   </message>
@@ -3578,10 +3581,7 @@
     Use default settings
   </message>
   <message name="IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TITLE" desc="Title of the personalize Google services section. When clicked, takes the user to the Google Activity Controls.">
-    Personalize Google services
-  </message>
-  <message name="IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TEXT" desc="Text of the personalize Google services section. When clicked, takes the user to the Google Activity Controls.">
-    Control how your browsing history personalizes Search, ads, and other Google services
+    Control how your browsing history is used to personalize Search, ads, and more
   </message>
 
   <if expr="not chromeos">
diff --git a/chrome/app_shim/BUILD.gn b/chrome/app_shim/BUILD.gn
index 986fa9d..d2c12e7a 100644
--- a/chrome/app_shim/BUILD.gn
+++ b/chrome/app_shim/BUILD.gn
@@ -19,7 +19,7 @@
     "//chrome/common",
     "//chrome/common:mojo_bindings",
     "//ipc",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//ui/base",
   ]
 }
diff --git a/chrome/app_shim/DEPS b/chrome/app_shim/DEPS
index f8d2667..90bfe99 100644
--- a/chrome/app_shim/DEPS
+++ b/chrome/app_shim/DEPS
@@ -1,5 +1,5 @@
 include_rules = [
   "+chrome/grit/generated_resources.h",
   "+chrome/installer/launcher_support",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
 ]
diff --git a/chrome/app_shim/chrome_main_app_mode_mac.mm b/chrome/app_shim/chrome_main_app_mode_mac.mm
index 70247313..65b4b414c 100644
--- a/chrome/app_shim/chrome_main_app_mode_mac.mm
+++ b/chrome/app_shim/chrome_main_app_mode_mac.mm
@@ -36,8 +36,8 @@
 #include "chrome/common/mac/app_shim.mojom.h"
 #include "chrome/common/mac/app_shim_messages.h"
 #include "chrome/grit/generated_resources.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 #include "mojo/public/cpp/system/isolated_connection.h"
@@ -616,10 +616,10 @@
   io_thread->StartWithOptions(io_thread_options);
   g_io_thread = io_thread;
 
-  mojo::edk::Init();
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::Init();
+  mojo::core::ScopedIPCSupport ipc_support(
       io_thread->task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
 
   // Find already running instances of Chrome.
   pid_t pid = -1;
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 57025ed..6de8014 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1840,7 +1840,7 @@
     "//media/mojo/interfaces:mirror_service_remoting",
     "//media/mojo/interfaces:remoting",
     "//media/mojo/services",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//net",
     "//net:extras",
diff --git a/chrome/browser/android/vr/vr_shell.cc b/chrome/browser/android/vr/vr_shell.cc
index 8ff6090..590d3e0 100644
--- a/chrome/browser/android/vr/vr_shell.cc
+++ b/chrome/browser/android/vr/vr_shell.cc
@@ -1322,7 +1322,7 @@
   helper->GetSecurityInfo(&security_info);
 
   return std::make_unique<PageInfo>(
-      this, ProfileManager::GetActiveUserProfile(),
+      this, Profile::FromBrowserContext(web_contents_->GetBrowserContext()),
       TabSpecificContentSettings::FromWebContents(web_contents_), web_contents_,
       entry->GetVirtualURL(), security_info);
 }
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 24728a1..682d3e1 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -31,7 +31,6 @@
 #include "base/metrics/field_trial.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
-#include "base/profiler/stack_sampling_profiler.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
@@ -136,6 +135,7 @@
 #include "components/language/content/browser/geo_language_provider.h"
 #include "components/language/core/common/language_experiments.h"
 #include "components/language_usage_metrics/language_usage_metrics.h"
+#include "components/metrics/call_stack_profile_builder.h"
 #include "components/metrics/call_stack_profile_metrics_provider.h"
 #include "components/metrics/call_stack_profile_params.h"
 #include "components/metrics/expired_histogram_util.h"
@@ -2097,7 +2097,7 @@
 }
 
 void ChromeBrowserMainParts::PreShutdown() {
-  base::StackSamplingProfiler::SetProcessMilestone(
+  metrics::CallStackProfileBuilder::SetProcessMilestone(
       metrics::CallStackProfileMetricsProvider::SHUTDOWN_START);
 }
 
diff --git a/chrome/browser/chromeos/policy/policy_cert_verifier.cc b/chrome/browser/chromeos/policy/policy_cert_verifier.cc
index a8fc978..7966f77 100644
--- a/chrome/browser/chromeos/policy/policy_cert_verifier.cc
+++ b/chrome/browser/chromeos/policy/policy_cert_verifier.cc
@@ -4,6 +4,9 @@
 
 #include "chrome/browser/chromeos/policy/policy_cert_verifier.h"
 
+#include <utility>
+
+#include "base/bind.h"
 #include "base/logging.h"
 #include "chrome/browser/browser_process.h"
 #include "content/public/browser/browser_thread.h"
@@ -27,15 +30,14 @@
   anchor_used_callback.Run();
 }
 
-void CompleteAndSignalAnchorUse(
-    const base::Closure& anchor_used_callback,
-    const net::CompletionCallback& completion_callback,
-    const net::CertVerifyResult* verify_result,
-    int error) {
+void CompleteAndSignalAnchorUse(const base::Closure& anchor_used_callback,
+                                net::CompletionOnceCallback completion_callback,
+                                const net::CertVerifyResult* verify_result,
+                                int error) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
   MaybeSignalAnchorUse(error, anchor_used_callback, *verify_result);
-  if (!completion_callback.is_null())
-    completion_callback.Run(error);
+  if (completion_callback)
+    std::move(completion_callback).Run(error);
 }
 
 }  // namespace
@@ -67,20 +69,17 @@
   trust_anchors_ = trust_anchors;
 }
 
-int PolicyCertVerifier::Verify(
-    const RequestParams& params,
-    net::CRLSet* crl_set,
-    net::CertVerifyResult* verify_result,
-    const net::CompletionCallback& completion_callback,
-    std::unique_ptr<Request>* out_req,
-    const net::NetLogWithSource& net_log) {
+int PolicyCertVerifier::Verify(const RequestParams& params,
+                               net::CRLSet* crl_set,
+                               net::CertVerifyResult* verify_result,
+                               net::CompletionOnceCallback completion_callback,
+                               std::unique_ptr<Request>* out_req,
+                               const net::NetLogWithSource& net_log) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
   DCHECK(delegate_);
-  net::CompletionCallback wrapped_callback =
-      base::Bind(&CompleteAndSignalAnchorUse,
-                 anchor_used_callback_,
-                 completion_callback,
-                 verify_result);
+  net::CompletionOnceCallback wrapped_callback =
+      base::BindOnce(&CompleteAndSignalAnchorUse, anchor_used_callback_,
+                     std::move(completion_callback), verify_result);
 
   net::CertificateList merged_trust_anchors(params.additional_trust_anchors());
   merged_trust_anchors.insert(merged_trust_anchors.begin(),
@@ -89,7 +88,7 @@
       params.certificate(), params.hostname(), params.flags(),
       params.ocsp_response(), merged_trust_anchors);
   int error = delegate_->Verify(new_params, crl_set, verify_result,
-                                wrapped_callback, out_req, net_log);
+                                std::move(wrapped_callback), out_req, net_log);
   MaybeSignalAnchorUse(error, anchor_used_callback_, *verify_result);
   return error;
 }
diff --git a/chrome/browser/chromeos/policy/policy_cert_verifier.h b/chrome/browser/chromeos/policy/policy_cert_verifier.h
index c7a7f80..71f1793d 100644
--- a/chrome/browser/chromeos/policy/policy_cert_verifier.h
+++ b/chrome/browser/chromeos/policy/policy_cert_verifier.h
@@ -12,7 +12,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/cert/cert_verifier.h"
 
 namespace net {
@@ -48,7 +48,7 @@
   int Verify(const RequestParams& params,
              net::CRLSet* crl_set,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback& callback,
+             net::CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const net::NetLogWithSource& net_log) override;
 
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index 2f156c3..f2a77f75f 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -14,11 +14,13 @@
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/devtools/protocol/target_handler.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
+#include "chrome/browser/policy/developer_tools_policy_handler.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_iterator.h"
+#include "chrome/common/chrome_switches.h"
 #include "chrome/grit/browser_resources.h"
 #include "components/guest_view/browser/guest_view_base.h"
 #include "content/public/browser/devtools_agent_host.h"
@@ -27,6 +29,7 @@
 #include "extensions/browser/extension_host.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/process_manager.h"
+#include "extensions/common/manifest.h"
 #include "ui/base/resource/resource_bundle.h"
 
 using content::DevToolsAgentHost;
@@ -121,6 +124,60 @@
   return extension_name;
 }
 
+bool ChromeDevToolsManagerDelegate::AllowInspectingWebContents(
+    content::WebContents* web_contents) {
+  return AllowInspection(
+      Profile::FromBrowserContext(web_contents->GetBrowserContext()),
+      web_contents);
+}
+
+// static
+bool ChromeDevToolsManagerDelegate::AllowInspection(
+    Profile* profile,
+    content::WebContents* web_contents) {
+  const extensions::Extension* extension = nullptr;
+  if (web_contents) {
+    extension =
+        extensions::ProcessManager::Get(
+            Profile::FromBrowserContext(web_contents->GetBrowserContext()))
+            ->GetExtensionForWebContents(web_contents);
+  }
+  return AllowInspection(profile, extension);
+}
+
+// static
+bool ChromeDevToolsManagerDelegate::AllowInspection(
+    Profile* profile,
+    const extensions::Extension* extension) {
+  using Availability = policy::DeveloperToolsPolicyHandler::Availability;
+  Availability availability =
+      policy::DeveloperToolsPolicyHandler::GetDevToolsAvailability(
+          profile->GetPrefs());
+#if defined(OS_CHROMEOS)
+  // Do not create DevTools if it's disabled for primary profile.
+  if (Profile* primary_profile = ProfileManager::GetPrimaryUserProfile()) {
+    availability =
+        policy::DeveloperToolsPolicyHandler::GetMostRestrictiveAvailability(
+            availability,
+            policy::DeveloperToolsPolicyHandler::GetDevToolsAvailability(
+                primary_profile->GetPrefs()));
+  }
+#endif
+
+  switch (availability) {
+    case Availability::kDisallowed:
+      return false;
+    case Availability::kAllowed:
+      return true;
+    case Availability::kDisallowedForForceInstalledExtensions:
+      return !extension ||
+             !extensions::Manifest::IsPolicyLocation(extension->location());
+    default:
+      NOTREACHED() << "Unknown developer tools policy";
+      return true;
+  }
+}
+
 void ChromeDevToolsManagerDelegate::ClientAttached(
     content::DevToolsAgentHost* agent_host,
     content::DevToolsAgentHostClient* client) {
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.h b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
index 365ab67..2d851bc 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.h
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
@@ -21,6 +21,10 @@
 class ChromeDevToolsSession;
 using RemoteLocations = std::set<net::HostPortPair>;
 
+namespace extensions {
+class Extension;
+}
+
 class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate {
  public:
   static const char kTypeApp[];
@@ -32,6 +36,16 @@
   static ChromeDevToolsManagerDelegate* GetInstance();
   void UpdateDeviceDiscovery();
 
+  // |web_contents| may be null, in which case this function just checks
+  // the settings for |profile|.
+  static bool AllowInspection(Profile* profile,
+                              content::WebContents* web_contents);
+
+  // |extension| may be null, in which case this function just checks
+  // the settings for |profile|.
+  static bool AllowInspection(Profile* profile,
+                              const extensions::Extension* extension);
+
  private:
   friend class DevToolsManagerDelegateTest;
 
@@ -42,6 +56,7 @@
                      base::DictionaryValue* command_dict) override;
   std::string GetTargetType(content::WebContents* web_contents) override;
   std::string GetTargetTitle(content::WebContents* web_contents) override;
+  bool AllowInspectingWebContents(content::WebContents* web_contents) override;
   void ClientAttached(content::DevToolsAgentHost* agent_host,
                       content::DevToolsAgentHostClient* client) override;
   void ClientDetached(content::DevToolsAgentHost* agent_host,
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc
index 02679178..bcef7a3 100644
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -80,6 +80,7 @@
 #include "extensions/browser/extension_system.h"
 #include "extensions/browser/notification_types.h"
 #include "extensions/browser/test_extension_registry_observer.h"
+#include "extensions/common/manifest.h"
 #include "extensions/common/switches.h"
 #include "extensions/common/value_builder.h"
 #include "extensions/test/test_extension_dir.h"
@@ -1906,8 +1907,7 @@
   ASSERT_TRUE(RunExtensionTest("target_list")) << message_;
 }
 
-using DevToolsPolicyTest = InProcessBrowserTest;
-IN_PROC_BROWSER_TEST_F(DevToolsPolicyTest, DevToolsAvailabilityPolicy) {
+IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, PolicyDisallowed) {
   browser()->profile()->GetPrefs()->SetInteger(
       prefs::kDevToolsAvailability,
       static_cast<int>(
@@ -1915,11 +1915,36 @@
   ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetWebContentsAt(0);
-  scoped_refptr<content::DevToolsAgentHost> agent(
-      content::DevToolsAgentHost::GetOrCreateFor(web_contents));
   DevToolsWindow::OpenDevToolsWindow(web_contents);
-  DevToolsWindow* window = DevToolsWindow::FindDevToolsWindow(agent.get());
-  ASSERT_FALSE(window);
+  auto agent_host = content::DevToolsAgentHost::GetOrCreateFor(web_contents);
+  ASSERT_FALSE(DevToolsWindow::FindDevToolsWindow(agent_host.get()));
+}
+
+using DevToolsSanityExtensionTest = extensions::ExtensionBrowserTest;
+IN_PROC_BROWSER_TEST_F(DevToolsSanityExtensionTest,
+                       PolicyDisallowedForForceInstalledExtensions) {
+  browser()->profile()->GetPrefs()->SetInteger(
+      prefs::kDevToolsAvailability,
+      static_cast<int>(policy::DeveloperToolsPolicyHandler::Availability::
+                           kDisallowedForForceInstalledExtensions));
+
+  base::FilePath crx_path;
+  base::PathService::Get(chrome::DIR_TEST_DATA, &crx_path);
+  crx_path = crx_path.AppendASCII("devtools")
+                 .AppendASCII("extensions")
+                 .AppendASCII("options.crx");
+  const Extension* extension = InstallExtension(
+      crx_path, 1, extensions::Manifest::EXTERNAL_POLICY_DOWNLOAD);
+  ASSERT_TRUE(extension);
+
+  GURL url("chrome-extension://" + extension->id() + "/options.html");
+  ui_test_utils::NavigateToURL(browser(), url);
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetWebContentsAt(0);
+
+  DevToolsWindow::OpenDevToolsWindow(web_contents);
+  auto agent_host = content::DevToolsAgentHost::GetOrCreateFor(web_contents);
+  ASSERT_FALSE(DevToolsWindow::FindDevToolsWindow(agent_host.get()));
 }
 
 class DevToolsPixelOutputTests : public DevToolsSanityTest {
diff --git a/chrome/browser/devtools/devtools_targets_ui.cc b/chrome/browser/devtools/devtools_targets_ui.cc
index ca736b4..4342c6b 100644
--- a/chrome/browser/devtools/devtools_targets_ui.cc
+++ b/chrome/browser/devtools/devtools_targets_ui.cc
@@ -17,6 +17,7 @@
 #include "base/values.h"
 #include "base/version.h"
 #include "chrome/browser/devtools/device/devtools_android_bridge.h"
+#include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/devtools/serialize_host_descriptions.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/devtools_agent_host.h"
@@ -152,6 +153,8 @@
   for (const scoped_refptr<DevToolsAgentHost>& host : targets) {
     if (Profile::FromBrowserContext(host->GetBrowserContext()) != profile_)
       continue;
+    if (!DevToolsWindow::AllowDevToolsFor(profile_, host->GetWebContents()))
+      continue;
     targets_[host->GetId()] = host;
     hosts.push_back({host->GetId(), host->GetParentId(),
                      std::move(*Serialize(host.get()))});
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index 2b93acdd..11f8684 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -17,12 +17,11 @@
 #include "base/values.h"
 #include "chrome/browser/certificate_viewer.h"
 #include "chrome/browser/data_use_measurement/data_use_web_contents_observer.h"
+#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
 #include "chrome/browser/devtools/devtools_eye_dropper.h"
 #include "chrome/browser/file_select_helper.h"
 #include "chrome/browser/infobars/infobar_service.h"
-#include "chrome/browser/policy/developer_tools_policy_handler.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/sessions/session_tab_helper.h"
 #include "chrome/browser/task_manager/web_contents_tags.h"
 #include "chrome/browser/ui/browser.h"
@@ -976,6 +975,17 @@
 }
 
 // static
+bool DevToolsWindow::AllowDevToolsFor(Profile* profile,
+                                      content::WebContents* web_contents) {
+  // Don't allow DevTools UI in kiosk mode, because the DevTools UI would be
+  // broken there. See https://crbug.com/514551 for context.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode))
+    return false;
+
+  return ChromeDevToolsManagerDelegate::AllowInspection(profile, web_contents);
+}
+
+// static
 DevToolsWindow* DevToolsWindow::Create(
     Profile* profile,
     content::WebContents* inspected_web_contents,
@@ -985,25 +995,8 @@
     const std::string& settings,
     const std::string& panel,
     bool has_other_clients) {
-  using DTPH = policy::DeveloperToolsPolicyHandler;
-  // TODO(pfeldman): Implement handling for
-  // Availability::kDisallowedForForceInstalledExtensions
-  // (https://crbug.com/838146).
-  if (DTPH::GetDevToolsAvailability(profile->GetPrefs()) ==
-          DTPH::Availability::kDisallowed ||
-      base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kKioskMode)) {
+  if (!AllowDevToolsFor(profile, inspected_web_contents))
     return nullptr;
-  }
-
-#if defined(OS_CHROMEOS)
-  // Do not create DevTools if it's disabled for primary profile.
-  const Profile* primary_profile = ProfileManager::GetPrimaryUserProfile();
-  if (primary_profile &&
-      DTPH::GetDevToolsAvailability(primary_profile->GetPrefs()) ==
-          DTPH::Availability::kDisallowed) {
-    return nullptr;
-  }
-#endif
 
   if (inspected_web_contents) {
     // Check for a place to dock.
diff --git a/chrome/browser/devtools/devtools_window.h b/chrome/browser/devtools/devtools_window.h
index 6fe1e2d1..5493a27b 100644
--- a/chrome/browser/devtools/devtools_window.h
+++ b/chrome/browser/devtools/devtools_window.h
@@ -48,6 +48,12 @@
 
   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
 
+  // Returns whether DevTools are allowed for the specified
+  // |profile| and |web_contents|. If |web_contents| is null,
+  // only checks for |profile| in general.
+  static bool AllowDevToolsFor(Profile* profile,
+                               content::WebContents* web_contents);
+
   // Return the DevToolsWindow for the given WebContents if one exists,
   // otherwise NULL.
   static DevToolsWindow* GetInstanceForInspectedWebContents(
diff --git a/chrome/browser/extensions/api/developer_private/inspectable_views_finder.cc b/chrome/browser/extensions/api/developer_private/inspectable_views_finder.cc
index d00406a..2abfd912 100644
--- a/chrome/browser/extensions/api/developer_private/inspectable_views_finder.cc
+++ b/chrome/browser/extensions/api/developer_private/inspectable_views_finder.cc
@@ -6,6 +6,7 @@
 
 #include <set>
 
+#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/extensions/api/developer_private.h"
 #include "content/public/browser/render_frame_host.h"
@@ -83,6 +84,8 @@
     const Extension& extension,
     bool is_enabled) {
   ViewList result;
+  if (!ChromeDevToolsManagerDelegate::AllowInspection(profile_, &extension))
+    return result;
   GetViewsForExtensionForProfile(
       extension, profile_, is_enabled, false, &result);
   if (profile_->HasOffTheRecordProfile()) {
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc
index 9658230e..77f1d0b3 100644
--- a/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -202,6 +202,9 @@
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
   (*s_whitelist)[::unified_consent::prefs::kUnifiedConsentGiven] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
+  (*s_whitelist)
+      [::unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled] =
+          settings_api::PrefType::PREF_TYPE_BOOLEAN;
 
   // Languages page
   (*s_whitelist)[spellcheck::prefs::kSpellCheckEnable] =
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 21e0020..20d3ea3 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -131,14 +131,14 @@
   int Verify(const RequestParams& params,
              net::CRLSet* crl_set,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback& callback,
+             net::CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const net::NetLogWithSource& net_log) override {
     verify_result->Reset();
     if (!g_cert_verifier_for_io_thread_testing)
       return net::ERR_FAILED;
     return g_cert_verifier_for_io_thread_testing->Verify(
-        params, crl_set, verify_result, callback, out_req, net_log);
+        params, crl_set, verify_result, std::move(callback), out_req, net_log);
   }
 };
 
diff --git a/chrome/browser/net/trial_comparison_cert_verifier.cc b/chrome/browser/net/trial_comparison_cert_verifier.cc
index fefcf47..4b583fc 100644
--- a/chrome/browser/net/trial_comparison_cert_verifier.cc
+++ b/chrome/browser/net/trial_comparison_cert_verifier.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/net/trial_comparison_cert_verifier.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/feature_list.h"
@@ -233,8 +234,8 @@
     // destruction.
     int rv = cert_verifier_->trial_verifier()->Verify(
         params_, crl_set_.get(), &trial_result_,
-        base::AdaptCallbackForRepeating(base::BindOnce(
-            &TrialVerificationJob::OnJobCompleted, base::Unretained(this))),
+        base::BindOnce(&TrialVerificationJob::OnJobCompleted,
+                       base::Unretained(this)),
         &trial_request_, net_log_);
     if (rv != net::ERR_IO_PENDING)
       OnJobCompleted(rv);
@@ -319,9 +320,9 @@
 
       int rv = cert_verifier_->trial_verifier()->Verify(
           reverification_params, crl_set_.get(), &reverification_result_,
-          base::AdaptCallbackForRepeating(base::BindOnce(
+          base::BindOnce(
               &TrialVerificationJob::OnMacRevcheckingReverificationJobCompleted,
-              base::Unretained(this))),
+              base::Unretained(this)),
           &reverification_request_, net_log_);
       if (rv != net::ERR_IO_PENDING)
         OnMacRevcheckingReverificationJobCompleted(rv);
@@ -343,10 +344,9 @@
 
       int rv = cert_verifier_->primary_reverifier()->Verify(
           reverification_params, crl_set_.get(), &reverification_result_,
-          base::AdaptCallbackForRepeating(
-              base::BindOnce(&TrialVerificationJob::
-                                 OnPrimaryReverifiyWithSecondaryChainCompleted,
-                             base::Unretained(this))),
+          base::BindOnce(&TrialVerificationJob::
+                             OnPrimaryReverifiyWithSecondaryChainCompleted,
+                         base::Unretained(this)),
           &reverification_request_, net_log_);
       if (rv != net::ERR_IO_PENDING)
         OnPrimaryReverifiyWithSecondaryChainCompleted(rv);
@@ -495,13 +495,13 @@
 int TrialComparisonCertVerifier::Verify(const RequestParams& params,
                                         net::CRLSet* crl_set,
                                         net::CertVerifyResult* verify_result,
-                                        const net::CompletionCallback& callback,
+                                        net::CompletionOnceCallback callback,
                                         std::unique_ptr<Request>* out_req,
                                         const net::NetLogWithSource& net_log) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
-  return primary_verifier_->Verify(params, crl_set, verify_result, callback,
-                                   out_req, net_log);
+  return primary_verifier_->Verify(params, crl_set, verify_result,
+                                   std::move(callback), out_req, net_log);
 }
 
 void TrialComparisonCertVerifier::OnPrimaryVerifierComplete(
diff --git a/chrome/browser/net/trial_comparison_cert_verifier.h b/chrome/browser/net/trial_comparison_cert_verifier.h
index 3cbb6df..b7bdea2 100644
--- a/chrome/browser/net/trial_comparison_cert_verifier.h
+++ b/chrome/browser/net/trial_comparison_cert_verifier.h
@@ -50,7 +50,7 @@
   int Verify(const RequestParams& params,
              net::CRLSet* crl_set,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback& callback,
+             net::CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const net::NetLogWithSource& net_log) override;
 
diff --git a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
index 487544b..f421082 100644
--- a/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
+++ b/chrome/browser/page_load_metrics/metrics_web_contents_observer_unittest.cc
@@ -163,7 +163,7 @@
     tracker->AddObserver(std::make_unique<FilteringPageLoadMetricsObserver>(
         &completed_filtered_urls_));
   }
-  std::unique_ptr<base::Timer> CreateTimer() override {
+  std::unique_ptr<base::OneShotTimer> CreateTimer() override {
     auto timer = std::make_unique<test::WeakMockTimer>();
     SetMockTimer(timer->AsWeakPtr());
     return std::move(timer);
diff --git a/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc b/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc
index 623b2885..bfe3ff0 100644
--- a/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc
+++ b/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_tester.cc
@@ -40,7 +40,7 @@
     test_->RegisterObservers(tracker);
   }
 
-  std::unique_ptr<base::Timer> CreateTimer() override {
+  std::unique_ptr<base::OneShotTimer> CreateTimer() override {
     auto timer = std::make_unique<test::WeakMockTimer>();
     test_->SetMockTimer(timer->AsWeakPtr());
     return std::move(timer);
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h b/chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h
index 000fa2e..bafc09a 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h
+++ b/chrome/browser/page_load_metrics/page_load_metrics_embedder_interface.h
@@ -10,7 +10,7 @@
 class GURL;
 
 namespace base {
-class Timer;
+class OneShotTimer;
 }  // namespace base
 
 namespace page_load_metrics {
@@ -24,7 +24,7 @@
   virtual ~PageLoadMetricsEmbedderInterface() {}
   virtual bool IsNewTabPageUrl(const GURL& url) = 0;
   virtual void RegisterObservers(PageLoadTracker* metrics) = 0;
-  virtual std::unique_ptr<base::Timer> CreateTimer() = 0;
+  virtual std::unique_ptr<base::OneShotTimer> CreateTimer() = 0;
 };
 
 }  // namespace page_load_metrics
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
index 9abac80..11ca710 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
+++ b/chrome/browser/page_load_metrics/page_load_metrics_initialize.cc
@@ -67,7 +67,7 @@
   // page_load_metrics::PageLoadMetricsEmbedderInterface:
   bool IsNewTabPageUrl(const GURL& url) override;
   void RegisterObservers(page_load_metrics::PageLoadTracker* tracker) override;
-  std::unique_ptr<base::Timer> CreateTimer() override;
+  std::unique_ptr<base::OneShotTimer> CreateTimer() override;
 
  private:
   bool IsPrerendering() const;
@@ -169,7 +169,7 @@
          nullptr;
 }
 
-std::unique_ptr<base::Timer> PageLoadMetricsEmbedder::CreateTimer() {
+std::unique_ptr<base::OneShotTimer> PageLoadMetricsEmbedder::CreateTimer() {
   return std::make_unique<base::OneShotTimer>();
 }
 
diff --git a/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h b/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h
index d4c52b7..7d1f5bfd 100644
--- a/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h
+++ b/chrome/browser/page_load_metrics/page_load_metrics_update_dispatcher.h
@@ -161,7 +161,7 @@
   // The client is guaranteed to outlive this object.
   Client* const client_;
 
-  std::unique_ptr<base::Timer> timer_;
+  std::unique_ptr<base::OneShotTimer> timer_;
 
   // Time the navigation for this page load was initiated.
   const base::TimeTicks navigation_start_;
diff --git a/chrome/browser/printing/cloud_print/test/DEPS b/chrome/browser/printing/cloud_print/test/DEPS
index d2e2b4a..93183200 100644
--- a/chrome/browser/printing/cloud_print/test/DEPS
+++ b/chrome/browser/printing/cloud_print/test/DEPS
@@ -2,5 +2,5 @@
   # Service-side mockup tests need service classes to mock.
   "+chrome/service",
   
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
 ]
diff --git a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
index 596a962..69d2186 100644
--- a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
+++ b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
@@ -52,8 +52,8 @@
 #include "ipc/ipc.mojom.h"
 #include "ipc/ipc_channel_mojo.h"
 #include "ipc/ipc_channel_proxy.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 #include "mojo/public/cpp/system/isolated_connection.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -216,10 +216,10 @@
   EXPECT_TRUE(service_process.Initialize(&main_message_loop, state));
 
   // Needed for IPC.
-  mojo::edk::Init();
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::Init();
+  mojo::core::ScopedIPCSupport ipc_support(
       service_process.io_task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
 
   MockServiceIPCServer server(&service_process,
                               service_process.io_task_runner(),
@@ -469,10 +469,10 @@
 }
 
 TEST_F(CloudPrintProxyPolicyStartupTest, StartAndShutdown) {
-  mojo::edk::Init();
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::Init();
+  mojo::core::ScopedIPCSupport ipc_support(
       BrowserThread::GetTaskRunnerForThread(BrowserThread::IO),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
 
   base::Process process =
       Launch("CloudPrintMockService_StartEnabledWaitForQuit");
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index b48d8f0..03be115 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -191,14 +191,14 @@
   int Verify(const RequestParams& params,
              net::CRLSet* crl_set,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback& callback,
+             net::CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const net::NetLogWithSource& net_log) override {
     verify_result->Reset();
     if (!g_cert_verifier_for_profile_io_data_testing)
       return net::ERR_FAILED;
     return g_cert_verifier_for_profile_io_data_testing->Verify(
-        params, crl_set, verify_result, callback, out_req, net_log);
+        params, crl_set, verify_result, std::move(callback), out_req, net_log);
   }
 };
 
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index 75ebdaa..e1bf8ab 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -447,15 +447,19 @@
 // static
 Profile* ProfileManager::GetPrimaryUserProfile() {
   ProfileManager* profile_manager = g_browser_process->profile_manager();
+  if (!profile_manager)  // Can be null in unit tests.
+    return nullptr;
 #if defined(OS_CHROMEOS)
   if (!profile_manager->IsLoggedIn() ||
       !user_manager::UserManager::IsInitialized())
     return profile_manager->GetActiveUserOrOffTheRecordProfileFromPath(
         profile_manager->user_data_dir());
   user_manager::UserManager* manager = user_manager::UserManager::Get();
+  const user_manager::User* user = manager->GetActiveUser();
+  if (!user)  // Can be null in unit tests.
+    return nullptr;
   // Note: The ProfileHelper will take care of guest profiles.
-  return chromeos::ProfileHelper::Get()->GetProfileByUserUnsafe(
-      manager->GetPrimaryUser());
+  return chromeos::ProfileHelper::Get()->GetProfileByUserUnsafe(user);
 #else
   return profile_manager->GetActiveUserOrOffTheRecordProfileFromPath(
       profile_manager->user_data_dir());
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 7402112e..7149575 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -40,7 +40,6 @@
 #include "chrome/browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/password_manager/chrome_password_manager_client.h"
 #include "chrome/browser/plugins/chrome_plugin_service_filter.h"
-#include "chrome/browser/policy/developer_tools_policy_handler.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_attributes_entry.h"
@@ -847,7 +846,7 @@
   }
 }
 
-Profile* RenderViewContextMenu::GetProfile() {
+Profile* RenderViewContextMenu::GetProfile() const {
   return Profile::FromBrowserContext(browser_context_);
 }
 
@@ -2133,13 +2132,8 @@
 
     // Don't enable the web inspector if the developer tools are disabled via
     // the preference dev-tools-disabled.
-    // TODO(pfeldman): Possibly implement handling for
-    // Availability::kDisallowedForForceInstalledExtensions
-    // (https://crbug.com/838146).
-    if (policy::DeveloperToolsPolicyHandler::GetDevToolsAvailability(prefs) ==
-        policy::DeveloperToolsPolicyHandler::Availability::kDisallowed) {
+    if (!DevToolsWindow::AllowDevToolsFor(GetProfile(), source_web_contents_))
       return false;
-    }
   }
 
   return true;
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.h b/chrome/browser/renderer_context_menu/render_view_context_menu.h
index 4383274..5409e557 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.h
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.h
@@ -80,7 +80,7 @@
       base::OnceCallback<void(RenderViewContextMenu*)> cb);
 
  protected:
-  Profile* GetProfile();
+  Profile* GetProfile() const;
   Browser* GetBrowser() const;
 
   // Returns a (possibly truncated) version of the current selection text
diff --git a/chrome/browser/resources/settings/people_page/sync_page.html b/chrome/browser/resources/settings/people_page/sync_page.html
index 4c43d85..66507cf 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.html
+++ b/chrome/browser/resources/settings/people_page/sync_page.html
@@ -93,10 +93,11 @@
 </if>
      <!-- A change of the unified consent toggle state is automatically handled
           in the C++ code after a change in the pref is observed. -->
-    <settings-toggle-button class="first" pref="{{prefs.unified_consent_given}}"
+    <settings-toggle-button id="unifiedConsentToggle" class="first"
+        pref="{{prefs.unified_consent_given}}"
         label="$i18n{syncUnifiedConsentToggleTitle}"
-        hidden="[[!shouldShowSyncControls_(unifiedConsentEnabled,
-                   syncStatus.disabled)]]">
+        hidden="[[!shouldShowUnifiedConsentToggle_(unifiedConsentEnabled,
+                   syncStatus.disabled, syncStatus.signedIn)]]">
     </settings-toggle-button>
     <div class="settings-box two-line" id="sync-section-toggle"
         actionable$="[[!syncSectionDisabled_]]"
@@ -308,30 +309,16 @@
 
         <div id="other-sync-items"
             class$="[[getListFrameClass_(unifiedConsentEnabled)]]">
-          <a class$="two-line inherit-color no-outline
+          <a class$="inherit-color no-outline
               [[getListItemClass_(unifiedConsentEnabled)]]" tabindex="-1"
               target="_blank" href="$i18n{activityControlsUrl}"
               on-click="onActivityControlsTap_">
             <div class="start">
               $i18n{personalizeGoogleServicesTitle}
-              <div class="secondary" id="activityControlsSecondary">
-                $i18n{personalizeGoogleServicesText}
-              </div>
             </div>
             <paper-icon-button-light actionable class="icon-external">
-              <button aria-label="$i18n{personalizeGoogleServicesTitle}"
-                  aria-describedby="activityControlsSecondary"></button>
-            </paper-icon-button-light>
-          </a>
-
-          <a class$="inherit-color no-outline
-              [[getListItemClass_(unifiedConsentEnabled)]]" tabindex="-1"
-              target="_blank" href="$i18n{syncDashboardUrl}">
-            <div class="start">
-              $i18n{manageSyncedDataTitle}
-            </div>
-            <paper-icon-button-light actionable class="icon-external">
-              <button aria-label="$i18n{manageSyncedDataTitle}"></button>
+              <button aria-label="$i18n{personalizeGoogleServicesTitle}">
+              </button>
             </paper-icon-button-light>
           </a>
 
@@ -399,6 +386,18 @@
               </div>
             </div>
           </template>
+
+          <a class$="inherit-color no-outline
+              [[getListItemClass_(unifiedConsentEnabled)]]" tabindex="-1"
+              target="_blank" href="$i18n{syncDashboardUrl}">
+            <div class="start">
+              $i18n{manageSyncedDataTitle}
+            </div>
+            <paper-icon-button-light actionable class="icon-external">
+              <button aria-label="$i18n{manageSyncedDataTitle}"></button>
+            </paper-icon-button-light>
+          </a>
+
         </div>
       </div>
     </iron-collapse>
diff --git a/chrome/browser/resources/settings/people_page/sync_page.js b/chrome/browser/resources/settings/people_page/sync_page.js
index b6fb1636..5cbfd36 100644
--- a/chrome/browser/resources/settings/people_page/sync_page.js
+++ b/chrome/browser/resources/settings/people_page/sync_page.js
@@ -584,6 +584,15 @@
   shouldShowSyncControls_: function() {
     return !!this.unifiedConsentEnabled && !this.syncStatus.disabled;
   },
+
+  /**
+   * @return {boolean}
+   * @private
+   */
+  shouldShowUnifiedConsentToggle_: function() {
+    return !!this.unifiedConsentEnabled && !this.syncStatus.disabled &&
+        !!this.syncStatus.signedIn;
+  },
 });
 
 })();
diff --git a/chrome/browser/resources/settings/privacy_page/personalization_options.html b/chrome/browser/resources/settings/privacy_page/personalization_options.html
index a462ab4..38f6139 100644
--- a/chrome/browser/resources/settings/privacy_page/personalization_options.html
+++ b/chrome/browser/resources/settings/privacy_page/personalization_options.html
@@ -22,15 +22,27 @@
         border-top: none;
       }
     </style>
+    <settings-toggle-button hidden="[[!pageVisibility.searchPrediction]]"
+        pref="{{prefs.search.suggest_enabled}}"
+        label="$i18n{searchSuggestPref}"
+        sub-label="$i18n{searchSuggestPrefDesc}"
+        disabled="[[unifiedConsentGiven]]">
+    </settings-toggle-button>
+    <settings-toggle-button hidden="[[!pageVisibility.networkPrediction]]"
+        pref="{{prefs.net.network_prediction_options}}"
+        label="$i18n{networkPredictionEnabled}"
+        sub-label="$i18n{networkPredictionEnabledDesc}"
+        numeric-unchecked-value="[[networkPredictionEnum_.NEVER]]"
+        disabled="[[unifiedConsentGiven]]">
+    </settings-toggle-button>
     <settings-toggle-button pref="{{prefs.alternate_error_pages.enabled}}"
         label="$i18n{linkDoctorPref}"
         sub-label="$i18n{linkDoctorPrefDesc}"
         disabled="[[unifiedConsentGiven]]">
     </settings-toggle-button>
-    <settings-toggle-button hidden="[[!pageVisibility.searchPrediction]]"
-        pref="{{prefs.search.suggest_enabled}}"
-        label="$i18n{searchSuggestPref}"
-        sub-label="$i18n{searchSuggestPrefDesc}"
+    <settings-toggle-button pref="{{prefs.safebrowsing.enabled}}"
+        label="$i18n{safeBrowsingEnableProtection}"
+        sub-label="$i18n{safeBrowsingEnableProtectionDesc}"
         disabled="[[unifiedConsentGiven]]">
     </settings-toggle-button>
     <settings-toggle-button id="safeBrowsingExtendedReportingControl"
@@ -41,40 +53,7 @@
         no-set-pref
         disabled="[[unifiedConsentGiven]]">
     </settings-toggle-button>
-    <settings-toggle-button hidden="[[!pageVisibility.networkPrediction]]"
-        pref="{{prefs.net.network_prediction_options}}"
-        label="$i18n{networkPredictionEnabled}"
-        sub-label="$i18n{networkPredictionEnabledDesc}"
-        numeric-unchecked-value="[[networkPredictionEnum_.NEVER]]"
-        disabled="[[unifiedConsentGiven]]">
-    </settings-toggle-button>
-    <settings-toggle-button pref="{{prefs.safebrowsing.enabled}}"
-        label="$i18n{safeBrowsingEnableProtection}"
-        sub-label="$i18n{safeBrowsingEnableProtectionDesc}"
-        disabled="[[unifiedConsentGiven]]">
-    </settings-toggle-button>
 <if expr="_google_chrome">
-    <template is="dom-if" if="[[!unifiedConsentEnabled]]">
-      <settings-toggle-button id="spellCheckControl"
-          pref="{{prefs.spellcheck.use_spelling_service}}"
-          label="$i18n{spellingPref}"
-          sub-label="$i18n{spellingDescription}"
-          disabled="[[unifiedConsentGiven]]">
-      </settings-toggle-button>
-    </template>
-    <template is="dom-if" if="[[unifiedConsentEnabled]]">
-      <div class="settings-box two-line" id="spellCheckLinkBox">
-        <div class="start">
-          $i18n{spellingPref}
-          <div class="secondary" on-click="onLanguageLinkBoxClick_">
-            $i18nRaw{spellingDescription}
-          </div>
-        </div>
-        <cr-toggle checked="[[prefs.spellcheck.use_spelling_service]]"
-            disabled="[[unifiedConsentGiven]]">
-        </cr-toggle>
-      </div>
-    </template>
 <if expr="chromeos">
     <settings-toggle-button pref="{{prefs.cros.metrics.reportingEnabled}}"
         label="$i18n{enableLogging}"
@@ -96,7 +75,34 @@
       </template>
     </settings-toggle-button>
 </if><!-- not chromeos -->
+    <template is="dom-if" if="[[!unifiedConsentEnabled]]">
+      <settings-toggle-button id="spellCheckControl"
+          pref="{{prefs.spellcheck.use_spelling_service}}"
+          label="$i18n{spellingPref}"
+          sub-label="$i18n{spellingDescription}"
+          disabled="[[unifiedConsentGiven]]">
+      </settings-toggle-button>
+    </template>
+    <template is="dom-if" if="[[unifiedConsentEnabled]]">
+      <div class="settings-box two-line" id="spellCheckLinkBox">
+        <div class="start">
+          $i18n{spellingPref}
+          <div class="secondary" on-click="onLanguageLinkBoxClick_">
+            $i18nRaw{spellingDescription}
+          </div>
+        </div>
+        <cr-toggle checked="[[prefs.spellcheck.use_spelling_service]]"
+            disabled="[[unifiedConsentGiven]]">
+        </cr-toggle>
+      </div>
+    </template>
 </if><!-- _google_chrome -->
+    <settings-toggle-button
+        pref="{{prefs.url_keyed_anonymized_data_collection.enabled}}"
+        label="$i18n{urlKeyedAnonymizedDataCollection}"
+        sub-label="$i18n{urlKeyedAnonymizedDataCollectionDesc}"
+        disabled="[[unifiedConsentGiven]]">
+    </settings-toggle-button>
   </template>
   <script src="personalization_options.js"></script>
 </dom-module>
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/mock_chrome_cleaner_process_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/mock_chrome_cleaner_process_win.cc
index 7e817d82..7a16171 100644
--- a/chrome/browser/safe_browsing/chrome_cleaner/mock_chrome_cleaner_process_win.cc
+++ b/chrome/browser/safe_browsing/chrome_cleaner/mock_chrome_cleaner_process_win.cc
@@ -16,8 +16,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/system/invitation.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -214,16 +214,16 @@
   if (options_.crash_point() == CrashPoint::kOnStartup)
     exit(kDeliberateCrashExitCode);
 
-  mojo::edk::Init();
+  mojo::core::Init();
   base::Thread::Options thread_options(base::MessageLoop::TYPE_IO, 0);
   base::Thread io_thread("IPCThread");
   EXPECT_TRUE(io_thread.StartWithOptions(thread_options));
   if (::testing::Test::HasFailure())
     return kInternalTestFailureExitCode;
 
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
 
   auto channel_endpoint =
       mojo::PlatformChannel::RecoverPassedEndpointFromCommandLine(
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index 89d8a4a..b489a668 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -44,6 +44,7 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "components/autofill/core/browser/webdata/autocomplete_sync_bridge.h"
+#include "components/autofill/core/browser/webdata/autofill_profile_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h"
 #include "components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h"
 #include "components/autofill/core/browser/webdata/autofill_wallet_syncable_service.h"
@@ -560,6 +561,11 @@
                  web_data_service_.get())
           ->change_processor()
           ->GetControllerDelegateOnUIThread();
+    case syncer::AUTOFILL_PROFILE:
+      return autofill::AutofillProfileSyncBridge::FromWebDataService(
+                 web_data_service_.get())
+          ->change_processor()
+          ->GetControllerDelegateOnUIThread();
 #if defined(OS_CHROMEOS)
     case syncer::PRINTERS:
       return chromeos::SyncedPrintersManagerFactory::GetForBrowserContext(
diff --git a/chrome/browser/ui/ash/chrome_keyboard_ui.cc b/chrome/browser/ui/ash/chrome_keyboard_ui.cc
index 89905212..442de44 100644
--- a/chrome/browser/ui/ash/chrome_keyboard_ui.cc
+++ b/chrome/browser/ui/ash/chrome_keyboard_ui.cc
@@ -470,7 +470,7 @@
   return (contents_window->GetRootWindow() == window->GetRootWindow() &&
           keyboard::IsKeyboardOverscrollEnabled() &&
           contents_window->IsVisible() &&
-          keyboard_controller()->keyboard_visible() &&
+          keyboard_controller()->IsKeyboardVisible() &&
           !keyboard::IsFullscreenHandwritingVirtualKeyboardEnabled());
 }
 
diff --git a/chrome/browser/ui/ash/keyboard_controller_browsertest.cc b/chrome/browser/ui/ash/keyboard_controller_browsertest.cc
index ce3d6ad..136778c 100644
--- a/chrome/browser/ui/ash/keyboard_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/keyboard_controller_browsertest.cc
@@ -84,7 +84,7 @@
   }
 
   bool IsKeyboardVisible() const {
-    return keyboard::KeyboardController::Get()->keyboard_visible();
+    return keyboard::KeyboardController::Get()->IsKeyboardVisible();
   }
 
  private:
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 477f8e4..c499915 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -2186,12 +2186,10 @@
 
 void Browser::OnDevToolsAvailabilityChanged() {
   using DTPH = policy::DeveloperToolsPolicyHandler;
-  // TODO(pfeldman): If |new_value| maps to
-  // |DTPH::Availability::kDisallowedForForceInstalledExtensions|, we may either
-  // close all windows as a safety measure, or close those that are known to
-  // correspond to such extensions (https://crbug.com/838146).
-  if (DTPH::GetDevToolsAvailability(profile_->GetPrefs()) ==
-      DTPH::Availability::kDisallowed) {
+  // We close all windows as a safety measure, even for
+  // kDisallowedForForceInstalledExtensions.
+  if (DTPH::GetDevToolsAvailability(profile_->GetPrefs()) !=
+      DTPH::Availability::kAllowed) {
     content::DevToolsAgentHost::DetachAllClients();
   }
 }
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc
index 0aa08bd..c1cd97d 100644
--- a/chrome/browser/ui/browser_command_controller.cc
+++ b/chrome/browser/ui/browser_command_controller.cc
@@ -18,10 +18,10 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/defaults.h"
+#include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/policy/developer_tools_policy_handler.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -1075,13 +1075,8 @@
   if (is_locked_fullscreen_)
     return;
 
-  using DTPH = policy::DeveloperToolsPolicyHandler;
-  // TODO(pfeldman): Possibly implement handling for
-  // Availability::kDisallowedForForceInstalledExtensions
-  // (https://crbug.com/838146).
-  bool dev_tools_enabled =
-      DTPH::GetDevToolsAvailability(profile()->GetPrefs()) !=
-      DTPH::Availability::kDisallowed;
+  bool dev_tools_enabled = DevToolsWindow::AllowDevToolsFor(
+      profile(), browser_->tab_strip_model()->GetActiveWebContents());
   command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS,
                                         dev_tools_enabled);
   command_updater_.UpdateCommandEnabled(IDC_DEV_TOOLS_CONSOLE,
diff --git a/chrome/browser/ui/browser_command_controller_unittest.cc b/chrome/browser/ui/browser_command_controller_unittest.cc
index 3251f0e2..96e92fd 100644
--- a/chrome/browser/ui/browser_command_controller_unittest.cc
+++ b/chrome/browser/ui/browser_command_controller_unittest.cc
@@ -200,20 +200,24 @@
   const CommandUpdater* command_updater = &command_controller;
 
   bool enabled = true;
+  size_t profiles_count = 1U;
 #if defined(OS_CHROMEOS)
   // Chrome OS uses system tray menu to handle multi-profiles.
   enabled = false;
+  profiles_count = 2U;
 #endif
 
-  ASSERT_EQ(1U, profile_manager->GetNumberOfProfiles());
+  ASSERT_EQ(profiles_count, profile_manager->GetNumberOfProfiles());
   EXPECT_EQ(enabled, command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
 
   testing_profile_manager->CreateTestingProfile("p2");
-  ASSERT_EQ(2U, profile_manager->GetNumberOfProfiles());
+  profiles_count++;
+  ASSERT_EQ(profiles_count, profile_manager->GetNumberOfProfiles());
   EXPECT_EQ(enabled, command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
 
   testing_profile_manager->DeleteTestingProfile("p2");
-  ASSERT_EQ(1U, profile_manager->GetNumberOfProfiles());
+  profiles_count--;
+  ASSERT_EQ(profiles_count, profile_manager->GetNumberOfProfiles());
   EXPECT_EQ(enabled, command_updater->IsCommandEnabled(IDC_SHOW_AVATAR_MENU));
 }
 
diff --git a/chrome/browser/ui/views/autofill/card_unmask_prompt_views.cc b/chrome/browser/ui/views/autofill/card_unmask_prompt_views.cc
index 0f53272..40ec0cda 100644
--- a/chrome/browser/ui/views/autofill/card_unmask_prompt_views.cc
+++ b/chrome/browser/ui/views/autofill/card_unmask_prompt_views.cc
@@ -204,24 +204,17 @@
   if (!controller_->CanStoreLocally())
     return nullptr;
 
-  // Local storage checkbox.
-  storage_row_ = new views::View();
-  ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
-  auto* storage_row_layout =
-      storage_row_->SetLayoutManager(std::make_unique<views::BoxLayout>(
-          views::BoxLayout::kHorizontal,
-          provider->GetInsetsMetric(views::INSETS_DIALOG_SUBSECTION)));
-
   storage_checkbox_ = new views::Checkbox(l10n_util::GetStringUTF16(
       IDS_AUTOFILL_CARD_UNMASK_PROMPT_STORAGE_CHECKBOX));
+  storage_checkbox_->SetBorder(
+      views::CreateEmptyBorder(ChromeLayoutProvider::Get()->GetInsetsMetric(
+          views::INSETS_DIALOG_SUBSECTION)));
   storage_checkbox_->SetChecked(controller_->GetStoreLocallyStartState());
   storage_checkbox_->SetEnabledTextColors(views::style::GetColor(
       *storage_checkbox_, ChromeTextContext::CONTEXT_BODY_TEXT_SMALL,
       STYLE_SECONDARY));
-  storage_row_->AddChildView(storage_checkbox_);
-  storage_row_layout->SetFlexForView(storage_checkbox_, 1);
 
-  return storage_row_;
+  return storage_checkbox_;
 }
 
 gfx::Size CardUnmaskPromptViews::CalculatePreferredSize() const {
diff --git a/chrome/browser/ui/views/autofill/card_unmask_prompt_views.h b/chrome/browser/ui/views/autofill/card_unmask_prompt_views.h
index 2d03810..c86a7ff9 100644
--- a/chrome/browser/ui/views/autofill/card_unmask_prompt_views.h
+++ b/chrome/browser/ui/views/autofill/card_unmask_prompt_views.h
@@ -111,7 +111,6 @@
   views::Label* error_label_ = nullptr;
 
   views::View* controls_container_ = nullptr;
-  views::View* storage_row_ = nullptr;
   views::Checkbox* storage_checkbox_ = nullptr;
 
   // Elements related to progress or error when the request is being made.
diff --git a/chrome/browser/ui/views/overlay/overlay_window_views.cc b/chrome/browser/ui/views/overlay/overlay_window_views.cc
index 6d0ea26..c9448aa 100644
--- a/chrome/browser/ui/views/overlay/overlay_window_views.cc
+++ b/chrome/browser/ui/views/overlay/overlay_window_views.cc
@@ -385,6 +385,7 @@
 void OverlayWindowViews::UpdateVideoSize(const gfx::Size& natural_size) {
   DCHECK(!natural_size.IsEmpty());
   natural_size_ = natural_size;
+  SetAspectRatio(natural_size_);
 
   // Update the views::Widget bounds to adhere to sizing spec.
   SetBounds(CalculateAndUpdateWindowBounds());
diff --git a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
index 30981c39..2cb3ee7 100644
--- a/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
+++ b/chrome/browser/ui/views/toolbar/browser_app_menu_button.cc
@@ -117,7 +117,7 @@
   if (features::IsAshInBrowserProcess()) {
     auto* keyboard_controller = keyboard::KeyboardController::Get();
     if (keyboard_controller->enabled() &&
-        keyboard_controller->keyboard_visible()) {
+        keyboard_controller->IsKeyboardVisible()) {
       keyboard_controller->HideKeyboardExplicitlyBySystem();
     }
   }
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index 9b217a9d..28118f01 100644
--- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -550,7 +550,7 @@
   if (features::IsAshInBrowserProcess()) {
     auto* keyboard_controller = keyboard::KeyboardController::Get();
     if (keyboard_controller->enabled()) {
-      const bool is_keyboard_shown = keyboard_controller->keyboard_visible();
+      const bool is_keyboard_shown = keyboard_controller->IsKeyboardVisible();
       ShowControlBar(!is_keyboard_shown);
       SetVirtualKeyboardShown(is_keyboard_shown);
     }
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 0c05a850..be0b32d 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
@@ -1689,8 +1689,6 @@
     {"submitPassphraseButton", IDS_SETTINGS_SUBMIT_PASSPHRASE},
     {"personalizeGoogleServicesTitle",
      IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TITLE},
-    {"personalizeGoogleServicesText",
-     IDS_SETTINGS_PERSONALIZE_GOOGLE_SERVICES_TEXT},
   };
   AddLocalizedStringsBulk(html_source, localized_strings,
                           arraysize(localized_strings));
@@ -1932,6 +1930,10 @@
       {"safeBrowsingEnableProtectionDesc",
        IDS_SETTINGS_SAFEBROWSING_ENABLEPROTECTION_DESC},
       {"syncAndPersonalizationLink", IDS_SETTINGS_PRIVACY_MORE_SETTINGS},
+      {"urlKeyedAnonymizedDataCollection",
+       IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION},
+      {"urlKeyedAnonymizedDataCollectionDesc",
+       IDS_SETTINGS_ENABLE_URL_KEYED_ANONYMIZED_DATA_COLLECTION_DESC},
   };
   AddLocalizedStringsBulk(html_source, localized_strings,
                           arraysize(localized_strings));
diff --git a/chrome/browser/vr/BUILD.gn b/chrome/browser/vr/BUILD.gn
index df2aafaf..a99b988e 100644
--- a/chrome/browser/vr/BUILD.gn
+++ b/chrome/browser/vr/BUILD.gn
@@ -414,7 +414,7 @@
     "//components/security_state/core",
     "//components/toolbar:vector_icons",
     "//content/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//skia",
     "//testing/gtest",
     "//ui/accessibility:ax_enums_mojo",
diff --git a/chrome/browser/vr/animation.cc b/chrome/browser/vr/animation.cc
index 121c741..0505fde 100644
--- a/chrome/browser/vr/animation.cc
+++ b/chrome/browser/vr/animation.cc
@@ -153,11 +153,15 @@
   keyframe_models_.push_back(std::move(keyframe_model));
 }
 
-void Animation::RemoveKeyframeModels() {
-  keyframe_models_.clear();
+void Animation::RemoveKeyframeModel(int keyframe_model_id) {
+  base::EraseIf(keyframe_models_,
+                [keyframe_model_id](
+                    const std::unique_ptr<cc::KeyframeModel>& keyframe_model) {
+                  return keyframe_model->id() == keyframe_model_id;
+                });
 }
 
-void Animation::RemoveKeyframeModelsWithProperty(int target_property) {
+void Animation::RemoveKeyframeModels(int target_property) {
   base::EraseIf(keyframe_models_,
                 [target_property](
                     const std::unique_ptr<cc::KeyframeModel>& keyframe_model) {
@@ -340,7 +344,7 @@
     return;
   }
 
-  RemoveKeyframeModelsWithProperty(target_property);
+  RemoveKeyframeModels(target_property);
 
   std::unique_ptr<typename AnimationTraits<ValueType>::KeyframedCurveType>
       curve(AnimationTraits<ValueType>::KeyframedCurveType::Create());
diff --git a/chrome/browser/vr/animation.h b/chrome/browser/vr/animation.h
index a860931..db4624a 100644
--- a/chrome/browser/vr/animation.h
+++ b/chrome/browser/vr/animation.h
@@ -44,8 +44,8 @@
   void set_target(cc::AnimationTarget* target) { target_ = target; }
 
   void AddKeyframeModel(std::unique_ptr<cc::KeyframeModel> keyframe_model);
-  void RemoveKeyframeModels();
-  void RemoveKeyframeModelsWithProperty(int target_property);
+  void RemoveKeyframeModel(int keyframe_model_id);
+  void RemoveKeyframeModels(int target_property);
 
   void Tick(base::TimeTicks monotonic_time);
 
diff --git a/chrome/browser/vr/animation_unittest.cc b/chrome/browser/vr/animation_unittest.cc
index 8d5d1d97..cb97c2f 100644
--- a/chrome/browser/vr/animation_unittest.cc
+++ b/chrome/browser/vr/animation_unittest.cc
@@ -97,11 +97,11 @@
   EXPECT_EQ(3ul, animation.keyframe_models().size());
   EXPECT_EQ(TRANSFORM, animation.keyframe_models()[2]->target_property_id());
 
-  animation.RemoveKeyframeModelsWithProperty(TRANSFORM);
+  animation.RemoveKeyframeModels(TRANSFORM);
   EXPECT_EQ(1ul, animation.keyframe_models().size());
   EXPECT_EQ(BOUNDS, animation.keyframe_models()[0]->target_property_id());
 
-  animation.RemoveKeyframeModels();
+  animation.RemoveKeyframeModel(animation.keyframe_models()[0]->id());
   EXPECT_TRUE(animation.keyframe_models().empty());
 }
 
diff --git a/chrome/browser/vr/elements/paged_scroll_view.cc b/chrome/browser/vr/elements/paged_scroll_view.cc
index 1cca5fe..a0af97ab 100644
--- a/chrome/browser/vr/elements/paged_scroll_view.cc
+++ b/chrome/browser/vr/elements/paged_scroll_view.cc
@@ -25,7 +25,7 @@
 
 void PagedScrollView::OnScrollBegin(std::unique_ptr<InputEvent> gesture,
                                     const gfx::PointF& position) {
-  animation().RemoveKeyframeModelsWithProperty(SCROLL_OFFSET);
+  animation().RemoveKeyframeModels(SCROLL_OFFSET);
   scroll_drag_delta_ = 0.0f;
 }
 
diff --git a/chrome/browser/vr/elements/throbber.cc b/chrome/browser/vr/elements/throbber.cc
index 5c2850f6..02ad7518 100644
--- a/chrome/browser/vr/elements/throbber.cc
+++ b/chrome/browser/vr/elements/throbber.cc
@@ -45,7 +45,7 @@
       SetScale(scale_before_animation_.scale.x, scale_before_animation_.scale.y,
                scale_before_animation_.scale.z);
     }
-    animation().RemoveKeyframeModelsWithProperty(CIRCLE_GROW);
+    animation().RemoveKeyframeModels(CIRCLE_GROW);
     return;
   }
 
diff --git a/chrome/browser/vr/elements/ui_element.cc b/chrome/browser/vr/elements/ui_element.cc
index 59efded..85b38b50 100644
--- a/chrome/browser/vr/elements/ui_element.cc
+++ b/chrome/browser/vr/elements/ui_element.cc
@@ -319,7 +319,7 @@
 
 void UiElement::SetVisibleImmediately(bool visible) {
   opacity_ = visible ? opacity_when_visible_ : 0.0;
-  animation_.RemoveKeyframeModelsWithProperty(OPACITY);
+  animation_.RemoveKeyframeModels(OPACITY);
 }
 
 bool UiElement::IsVisible() const {
@@ -807,12 +807,12 @@
   animation_.AddKeyframeModel(std::move(keyframe_model));
 }
 
-void UiElement::RemoveKeyframeModels() {
-  animation_.RemoveKeyframeModels();
+void UiElement::RemoveKeyframeModel(int keyframe_model_id) {
+  animation_.RemoveKeyframeModel(keyframe_model_id);
 }
 
-void UiElement::RemoveKeyframeModelsWithProperty(int target_property) {
-  animation_.RemoveKeyframeModelsWithProperty(target_property);
+void UiElement::RemoveKeyframeModels(int target_property) {
+  animation_.RemoveKeyframeModels(target_property);
 }
 
 bool UiElement::IsAnimatingProperty(TargetProperty property) const {
diff --git a/chrome/browser/vr/elements/ui_element.h b/chrome/browser/vr/elements/ui_element.h
index b121e2ff..7156196 100644
--- a/chrome/browser/vr/elements/ui_element.h
+++ b/chrome/browser/vr/elements/ui_element.h
@@ -404,8 +404,8 @@
   void SetTransitionDuration(base::TimeDelta delta);
 
   void AddKeyframeModel(std::unique_ptr<cc::KeyframeModel> keyframe_model);
-  void RemoveKeyframeModels();
-  void RemoveKeyframeModelsWithProperty(int target_property);
+  void RemoveKeyframeModel(int keyframe_model_id);
+  void RemoveKeyframeModels(int target_property);
   bool IsAnimatingProperty(TargetProperty property) const;
 
   // Recursive method that sizes and lays out element subtrees.
diff --git a/chrome/browser/vr/test/DEPS b/chrome/browser/vr/test/DEPS
index 9a5b6ca4..806aa67 100644
--- a/chrome/browser/vr/test/DEPS
+++ b/chrome/browser/vr/test/DEPS
@@ -1,5 +1,5 @@
 include_rules = [
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+device/vr/openvr/test/test_hook.h",
   "+device/vr/openvr/openvr_device_provider.h"
 ]
\ No newline at end of file
diff --git a/chrome/browser/vr/test/vr_test_suite.cc b/chrome/browser/vr/test/vr_test_suite.cc
index bf5a4761..6e95bee 100644
--- a/chrome/browser/vr/test/vr_test_suite.cc
+++ b/chrome/browser/vr/test/vr_test_suite.cc
@@ -10,7 +10,7 @@
 #include "base/path_service.h"
 #include "base/test/scoped_task_environment.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/base/material_design/material_design_controller.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
@@ -28,7 +28,7 @@
       std::make_unique<base::test::ScopedTaskEnvironment>(
           base::test::ScopedTaskEnvironment::MainThreadType::UI);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   base::FilePath pak_path;
 #if defined(OS_ANDROID)
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc
index 4d140cd..b49f038 100644
--- a/chrome/browser/vr/ui_scene_creator.cc
+++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -3046,7 +3046,7 @@
                       model->capturing_state.*spec.background_signal);
             }
 
-            e->RemoveKeyframeModelsWithProperty(TRANSFORM);
+            e->RemoveKeyframeModels(TRANSFORM);
             if (in_long_press) {
               // We do not do a translation animation for long press.
               e->SetTranslate(0, 0, 0);
diff --git a/chrome/common/thread_profiler.cc b/chrome/common/thread_profiler.cc
index ed9ba92..b209de5 100644
--- a/chrome/common/thread_profiler.cc
+++ b/chrome/common/thread_profiler.cc
@@ -22,6 +22,7 @@
 #include "services/service_manager/embedder/switches.h"
 #include "services/service_manager/public/cpp/connector.h"
 
+using CallStackProfileBuilder = metrics::CallStackProfileBuilder;
 using CallStackProfileParams = metrics::CallStackProfileParams;
 using StackSamplingProfiler = base::StackSamplingProfiler;
 
diff --git a/chrome/common/thread_profiler.h b/chrome/common/thread_profiler.h
index 36862ce7..c87c8f55 100644
--- a/chrome/common/thread_profiler.h
+++ b/chrome/common/thread_profiler.h
@@ -93,19 +93,22 @@
           scoped_refptr<base::SingleThreadTaskRunner>());
 
   // Gets the completed callback for the ultimate receiver of the profile.
-  CallStackProfileBuilder::CompletedCallback GetReceiverCallback(
+  metrics::CallStackProfileBuilder::CompletedCallback GetReceiverCallback(
       const metrics::CallStackProfileParams& profile_params);
 
-  // Receives |profile| from the CallStackProfileBuilder and forwards it on to
-  // the original |receiver_callback|.  Note that we must obtain and bind the
-  // original receiver callback prior to the start of collection because the
-  // collection start time is currently recorded when obtaining the callback in
-  // some collection scenarios. The implementation contains a TODO to fix this.
+  // Receives |profile| from the metrics::CallStackProfileBuilder and forwards
+  // it on to the original |receiver_callback|.  Note that we must obtain and
+  // bind the original receiver callback prior to the start of collection
+  // because the collection start time is currently recorded when obtaining the
+  // callback in some collection scenarios. The implementation contains a TODO
+  // to fix this.
   static void ReceiveStartupProfile(
-      const CallStackProfileBuilder::CompletedCallback& receiver_callback,
+      const metrics::CallStackProfileBuilder::CompletedCallback&
+          receiver_callback,
       base::StackSamplingProfiler::CallStackProfile profile);
   static void ReceivePeriodicProfile(
-      const CallStackProfileBuilder::CompletedCallback& receiver_callback,
+      const metrics::CallStackProfileBuilder::CompletedCallback&
+          receiver_callback,
       scoped_refptr<base::SingleThreadTaskRunner> owning_thread_task_runner,
       base::WeakPtr<ThreadProfiler> thread_profiler,
       base::StackSamplingProfiler::CallStackProfile profile);
diff --git a/chrome/renderer/page_load_metrics/metrics_render_frame_observer.cc b/chrome/renderer/page_load_metrics/metrics_render_frame_observer.cc
index f1a2126..99fe8d02 100644
--- a/chrome/renderer/page_load_metrics/metrics_render_frame_observer.cc
+++ b/chrome/renderer/page_load_metrics/metrics_render_frame_observer.cc
@@ -225,7 +225,7 @@
   return timing;
 }
 
-std::unique_ptr<base::Timer> MetricsRenderFrameObserver::CreateTimer() {
+std::unique_ptr<base::OneShotTimer> MetricsRenderFrameObserver::CreateTimer() {
   return std::make_unique<base::OneShotTimer>();
 }
 
diff --git a/chrome/renderer/page_load_metrics/metrics_render_frame_observer.h b/chrome/renderer/page_load_metrics/metrics_render_frame_observer.h
index dc1d317..c04f150 100644
--- a/chrome/renderer/page_load_metrics/metrics_render_frame_observer.h
+++ b/chrome/renderer/page_load_metrics/metrics_render_frame_observer.h
@@ -13,7 +13,7 @@
 #include "third_party/blink/public/platform/web_loading_behavior_flag.h"
 
 namespace base {
-class Timer;
+class OneShotTimer;
 }  // namespace base
 
 namespace page_load_metrics {
@@ -58,7 +58,7 @@
  private:
   void SendMetrics();
   virtual mojom::PageLoadTimingPtr GetTiming() const;
-  virtual std::unique_ptr<base::Timer> CreateTimer();
+  virtual std::unique_ptr<base::OneShotTimer> CreateTimer();
   virtual std::unique_ptr<PageTimingSender> CreatePageTimingSender();
   virtual bool HasNoRenderFrame() const;
 
diff --git a/chrome/renderer/page_load_metrics/metrics_render_frame_observer_unittest.cc b/chrome/renderer/page_load_metrics/metrics_render_frame_observer_unittest.cc
index 2276400..3a0b3e9 100644
--- a/chrome/renderer/page_load_metrics/metrics_render_frame_observer_unittest.cc
+++ b/chrome/renderer/page_load_metrics/metrics_render_frame_observer_unittest.cc
@@ -25,7 +25,7 @@
  public:
   TestMetricsRenderFrameObserver() : MetricsRenderFrameObserver(nullptr) {}
 
-  std::unique_ptr<base::Timer> CreateTimer() override {
+  std::unique_ptr<base::OneShotTimer> CreateTimer() override {
     auto timer = std::make_unique<test::WeakMockTimer>();
     SetMockTimer(timer->AsWeakPtr());
     return std::move(timer);
diff --git a/chrome/renderer/page_load_metrics/page_timing_metrics_sender.cc b/chrome/renderer/page_load_metrics/page_timing_metrics_sender.cc
index ce4b02a6..d283c75f 100644
--- a/chrome/renderer/page_load_metrics/page_timing_metrics_sender.cc
+++ b/chrome/renderer/page_load_metrics/page_timing_metrics_sender.cc
@@ -24,7 +24,7 @@
 
 PageTimingMetricsSender::PageTimingMetricsSender(
     std::unique_ptr<PageTimingSender> sender,
-    std::unique_ptr<base::Timer> timer,
+    std::unique_ptr<base::OneShotTimer> timer,
     mojom::PageLoadTimingPtr initial_timing)
     : sender_(std::move(sender)),
       timer_(std::move(timer)),
diff --git a/chrome/renderer/page_load_metrics/page_timing_metrics_sender.h b/chrome/renderer/page_load_metrics/page_timing_metrics_sender.h
index 730e3e3..316ede2 100644
--- a/chrome/renderer/page_load_metrics/page_timing_metrics_sender.h
+++ b/chrome/renderer/page_load_metrics/page_timing_metrics_sender.h
@@ -15,7 +15,7 @@
 #include "third_party/blink/public/platform/web_loading_behavior_flag.h"
 
 namespace base {
-class Timer;
+class OneShotTimer;
 }  // namespace base
 
 namespace page_load_metrics {
@@ -28,7 +28,7 @@
 class PageTimingMetricsSender {
  public:
   PageTimingMetricsSender(std::unique_ptr<PageTimingSender> sender,
-                          std::unique_ptr<base::Timer> timer,
+                          std::unique_ptr<base::OneShotTimer> timer,
                           mojom::PageLoadTimingPtr initial_timing);
   ~PageTimingMetricsSender();
 
@@ -38,7 +38,7 @@
   void Send(mojom::PageLoadTimingPtr timing);
 
  protected:
-  base::Timer* timer() const { return timer_.get(); }
+  base::OneShotTimer* timer() const { return timer_.get(); }
 
  private:
   void EnsureSendTimer();
@@ -46,7 +46,7 @@
   void ClearNewFeatures();
 
   std::unique_ptr<PageTimingSender> sender_;
-  std::unique_ptr<base::Timer> timer_;
+  std::unique_ptr<base::OneShotTimer> timer_;
   mojom::PageLoadTimingPtr last_timing_;
 
   // The the sender keep track of metadata as it comes in, because the sender is
diff --git a/chrome/service/DEPS b/chrome/service/DEPS
index 7c923f5..9e3b62a 100644
--- a/chrome/service/DEPS
+++ b/chrome/service/DEPS
@@ -6,6 +6,6 @@
   "+components/network_session_configurator/common",
   "+components/prefs",
   "+components/version_info",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+sandbox/win/src",
 ]
diff --git a/chrome/service/service_process.cc b/chrome/service/service_process.cc
index 81df226..0c5c0a4 100644
--- a/chrome/service/service_process.cc
+++ b/chrome/service/service_process.cc
@@ -45,8 +45,8 @@
 #include "components/language/core/common/locale_util.h"
 #include "components/network_session_configurator/common/network_switches.h"
 #include "components/prefs/json_pref_store.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "net/base/network_change_notifier.h"
 #include "net/url_request/url_fetcher.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -182,10 +182,10 @@
   }
 
   // Initialize Mojo early so things can use it.
-  mojo::edk::Init();
-  mojo_ipc_support_.reset(new mojo::edk::ScopedIPCSupport(
+  mojo::core::Init();
+  mojo_ipc_support_.reset(new mojo::core::ScopedIPCSupport(
       io_thread_->task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST));
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST));
 
   request_context_getter_ = new ServiceURLRequestContextGetter();
 
diff --git a/chrome/service/service_process.h b/chrome/service/service_process.h
index c8625cf..d699b03 100644
--- a/chrome/service/service_process.h
+++ b/chrome/service/service_process.h
@@ -30,7 +30,7 @@
 
 namespace mojo {
 class IsolatedConnection;
-namespace edk {
+namespace core {
 class ScopedIPCSupport;
 }
 }
@@ -117,7 +117,7 @@
   std::unique_ptr<ServiceProcessPrefs> service_prefs_;
   std::unique_ptr<ServiceIPCServer> ipc_server_;
   std::unique_ptr<ServiceProcessState> service_process_state_;
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> mojo_ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> mojo_ipc_support_;
   std::unique_ptr<mojo::IsolatedConnection> mojo_connection_;
 
   // An event that will be signalled when we shutdown.
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index d5417c5c..73bddc0 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4507,7 +4507,7 @@
     "//chrome:strings",
     "//chrome/browser",
     "//chrome/common",
-    "//mojo/edk/test:test_support",
+    "//mojo/core/test:test_support",
   ]
 
   if (is_win) {
@@ -4815,7 +4815,7 @@
       "//device/fido:test_support",
       "//extensions/buildflags",
       "//google_apis:test_support",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//net",
       "//net:net_resources",
       "//net:test_support",
@@ -4983,7 +4983,7 @@
         "//ash/public/interfaces:test_interfaces",
         "//chrome/browser/media/router:test_support",
         "//chromeos",
-        "//mojo/edk",
+        "//mojo/core/embedder",
       ]
 
       data += [
diff --git a/chrome/test/DEPS b/chrome/test/DEPS
index 6062c0b..2797e54 100644
--- a/chrome/test/DEPS
+++ b/chrome/test/DEPS
@@ -24,7 +24,7 @@
 
   "+gin/public",
   "+media/base",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+sandbox/win/tests",
   "+third_party/ocmock",
   "+third_party/webrtc",
diff --git a/chrome/test/base/run_all_unittests.cc b/chrome/test/base/run_all_unittests.cc
index 89f2415..a69c7eb 100644
--- a/chrome/test/base/run_all_unittests.cc
+++ b/chrome/test/base/run_all_unittests.cc
@@ -9,7 +9,7 @@
 #include "build/build_config.h"
 #include "chrome/test/base/chrome_unit_test_suite.h"
 #include "content/public/test/unittest_test_suite.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 
 #if defined(OS_WIN)
 #include "chrome/install_static/test/scoped_install_details.h"
@@ -19,9 +19,9 @@
   content::UnitTestTestSuite test_suite(new ChromeUnitTestSuite(argc, argv));
 
   base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       test_io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
 
 #if defined(OS_WIN)
   install_static::ScopedInstallDetails scoped_install_details;
diff --git a/chrome/test/base/view_event_test_base.cc b/chrome/test/base/view_event_test_base.cc
index 448fe85..c7b9730f 100644
--- a/chrome/test/base/view_event_test_base.cc
+++ b/chrome/test/base/view_event_test_base.cc
@@ -13,7 +13,7 @@
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/view_event_test_platform_part.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/base/ime/input_method_initializer.h"
 #include "ui/base/test/ui_controls.h"
 #include "ui/compositor/test/context_factories_for_test.h"
@@ -74,7 +74,7 @@
   // Mojo is initialized here similar to how each browser test case initializes
   // Mojo when starting. This only works because each interactive_ui_test runs
   // in a new process.
-  mojo::edk::Init();
+  mojo::core::Init();
 
   ui::InitializeInputMethodForTesting();
 
diff --git a/chrome/test/data/devtools/extensions/options.crx b/chrome/test/data/devtools/extensions/options.crx
new file mode 100644
index 0000000..4c4b1f9
--- /dev/null
+++ b/chrome/test/data/devtools/extensions/options.crx
Binary files differ
diff --git a/chrome/test/data/webui/settings/people_page_sync_page_test.js b/chrome/test/data/webui/settings/people_page_sync_page_test.js
index d46c73d..0423e02 100644
--- a/chrome/test/data/webui/settings/people_page_sync_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_sync_page_test.js
@@ -127,6 +127,7 @@
       const ironCollapse = syncPage.$$('#sync-section');
       const otherItems = syncPage.$$('#other-sync-items');
       const syncSectionToggle = syncPage.$$('#sync-section-toggle');
+      const unifiedConsentToggle = syncPage.$$('#unifiedConsentToggle');
 
       // When unified-consent is disabled and signed in, sync-section should be
       // visible and open by default. Accordion toggle row should not be present
@@ -139,6 +140,9 @@
       assertTrue(syncSectionToggle.hidden);
       assertFalse(otherItems.classList.contains('list-frame'));
       assertFalse(!!otherItems.querySelector('list-item'));
+
+      // The unified consent toggle should be hidden.
+      assertTrue(unifiedConsentToggle.hidden);
     });
 
     test('SyncSectionLayout_UnifiedConsentEnabled_SignedIn', function() {
@@ -146,6 +150,7 @@
       const otherItems = syncPage.$$('#other-sync-items');
       const syncSectionToggle = syncPage.$$('#sync-section-toggle');
       const expandIcon = syncSectionToggle.querySelector('cr-expand-button');
+      const unifiedConsentToggle = syncPage.$$('#unifiedConsentToggle');
 
       // When unified-consent is enabled and signed in, sync-section should be
       // visible and open by default. Accordion toggle row should be present,
@@ -172,12 +177,16 @@
       Polymer.dom.flush();
       assertTrue(ironCollapse.opened);
       assertTrue(expandIcon.expanded);
+
+      // The unified consent toggle should be visible.
+      assertFalse(unifiedConsentToggle.hidden);
     });
 
     test('SyncSectionLayout_UnifiedConsentEnabled_SignedOut', function() {
       const ironCollapse = syncPage.$$('#sync-section');
       const syncSectionToggle = syncPage.$$('#sync-section-toggle');
       const expandIcon = syncSectionToggle.querySelector('cr-expand-button');
+      const unifiedConsentToggle = syncPage.$$('#unifiedConsentToggle');
 
       // When unified-consent is enabled and signed out, sync-section should be
       // hidden, and the accordion toggle row should be visible not actionable.
@@ -189,11 +198,15 @@
       assertFalse(syncSectionToggle.hasAttribute('actionable'));
       assertFalse(expandIcon.expanded);
       assertTrue(expandIcon.disabled);
+
+      // The unified consent toggle should be hidden.
+      assertTrue(unifiedConsentToggle.hidden);
     });
 
     test('SyncSectionLayout_UnifiedConsentEnabled_SyncDisabled', function() {
       const ironCollapse = syncPage.$$('#sync-section');
       const syncSectionToggle = syncPage.$$('#sync-section-toggle');
+      const unifiedConsentToggle = syncPage.$$('#unifiedConsentToggle');
 
       // When unified-consent is enabled and sync is disabled, the sync-section
       // should be hidden.
@@ -202,6 +215,9 @@
       Polymer.dom.flush();
       assertTrue(ironCollapse.hidden);
       assertTrue(syncSectionToggle.hidden);
+
+      // The unified consent toggle should be hidden.
+      assertTrue(unifiedConsentToggle.hidden);
     });
 
     test('LoadingAndTimeout', function() {
diff --git a/chrome/utility/importer/DEPS b/chrome/utility/importer/DEPS
index a02ca6bbf..52ab1e7 100644
--- a/chrome/utility/importer/DEPS
+++ b/chrome/utility/importer/DEPS
@@ -8,6 +8,6 @@
 
 specific_include_rules = {
   "firefox_importer_unittest_utils_mac\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ],
 }
diff --git a/chromecast/app/BUILD.gn b/chromecast/app/BUILD.gn
index a1660b36..d172b5a 100644
--- a/chromecast/app/BUILD.gn
+++ b/chromecast/app/BUILD.gn
@@ -81,7 +81,7 @@
     "//chromecast/base",
     "//content/test:test_support",
     "//ipc",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
 }
 
diff --git a/chromecast/app/DEPS b/chromecast/app/DEPS
index 19d7005..c0a18c3 100644
--- a/chromecast/app/DEPS
+++ b/chromecast/app/DEPS
@@ -15,6 +15,6 @@
 specific_include_rules = {
   "cast_test_launcher\.cc": [
     "+content/public/test",
-    "+mojo/edk/embedder/embedder.h",
+    "+mojo/core/embedder/embedder.h",
   ],
 }
diff --git a/chromecast/app/cast_test_launcher.cc b/chromecast/app/cast_test_launcher.cc
index 47cd697..2112811 100644
--- a/chromecast/app/cast_test_launcher.cc
+++ b/chromecast/app/cast_test_launcher.cc
@@ -10,7 +10,7 @@
 #include "chromecast/app/cast_main_delegate.h"
 #include "content/public/test/test_launcher.h"
 #include "ipc/ipc_channel.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 namespace chromecast {
 namespace shell {
@@ -49,6 +49,6 @@
     parallel_jobs /= 2U;
   }
   chromecast::shell::CastTestLauncherDelegate launcher_delegate;
-  mojo::edk::Init();
+  mojo::core::Init();
   return content::LaunchTests(&launcher_delegate, parallel_jobs, argc, argv);
 }
diff --git a/chromecast/browser/extension_request_protocol_handler.cc b/chromecast/browser/extension_request_protocol_handler.cc
index 627c7d1..d4215595 100644
--- a/chromecast/browser/extension_request_protocol_handler.cc
+++ b/chromecast/browser/extension_request_protocol_handler.cc
@@ -90,6 +90,9 @@
       sub_request_(request->context()->CreateRequest(redirect_url,
                                                      request->priority(),
                                                      this)) {
+  // Copy necessary information from the original request.
+  // (|URLRequest| is not copyable.)
+  sub_request_->set_method(request->method());
   content::URLRequestUserData* user_data =
       static_cast<content::URLRequestUserData*>(
           request->GetUserData(content::URLRequestUserData::kUserDataKey));
diff --git a/chromecast/graphics/BUILD.gn b/chromecast/graphics/BUILD.gn
index 960230d..7571fb7 100644
--- a/chromecast/graphics/BUILD.gn
+++ b/chromecast/graphics/BUILD.gn
@@ -113,7 +113,7 @@
     deps = [
       ":graphics",
       "//base/test:test_support",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//testing/gtest",
       "//ui/aura",
       "//ui/aura:test_support",
diff --git a/chromecast/graphics/DEPS b/chromecast/graphics/DEPS
index efb3e33..a88964a 100644
--- a/chromecast/graphics/DEPS
+++ b/chromecast/graphics/DEPS
@@ -17,6 +17,6 @@
 
 specific_include_rules = {
   "run_all_unittests\.cc": [
-      "+mojo/edk/embedder",
+      "+mojo/core/embedder",
   ]
 }
diff --git a/chromecast/graphics/run_all_unittests.cc b/chromecast/graphics/run_all_unittests.cc
index e59ef00..a5a36ac 100644
--- a/chromecast/graphics/run_all_unittests.cc
+++ b/chromecast/graphics/run_all_unittests.cc
@@ -6,7 +6,7 @@
 #include "base/macros.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/env.h"
 #include "ui/gl/test/gl_surface_test_support.h"
@@ -37,7 +37,7 @@
 int main(int argc, char** argv) {
   ChromecastGraphicsTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(argc, argv,
                                base::BindOnce(&ChromecastGraphicsTestSuite::Run,
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn
index 09ab593..f180b5af 100644
--- a/chromeos/BUILD.gn
+++ b/chromeos/BUILD.gn
@@ -690,7 +690,7 @@
     "//dbus:test_support",
     "//google_apis",
     "//media/base:video_facing",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net",
     "//net:test_support",
     "//services/network:test_support",
diff --git a/chromeos/DEPS b/chromeos/DEPS
index 8bd952a..ec728f1 100644
--- a/chromeos/DEPS
+++ b/chromeos/DEPS
@@ -22,7 +22,7 @@
 
 specific_include_rules = {
   ".*run_all_unittests.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ],
 
   ".*test\.cc": [
diff --git a/chromeos/components/BUILD.gn b/chromeos/components/BUILD.gn
index 17af193..d3f1f73 100644
--- a/chromeos/components/BUILD.gn
+++ b/chromeos/components/BUILD.gn
@@ -19,6 +19,6 @@
     "//chromeos/components/drivefs:unit_tests",
     "//chromeos/components/proximity_auth:unit_tests",
     "//chromeos/components/tether:unit_tests",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
 }
diff --git a/chromeos/components/run_all_unittests.cc b/chromeos/components/run_all_unittests.cc
index 660ab97..f3fa16ea 100644
--- a/chromeos/components/run_all_unittests.cc
+++ b/chromeos/components/run_all_unittests.cc
@@ -5,11 +5,11 @@
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   // Some unit tests make Mojo calls.
-  mojo::edk::Init();
+  mojo::core::Init();
 
   base::TestSuite test_suite(argc, argv);
   return base::LaunchUnitTests(
diff --git a/chromeos/run_all_unittests.cc b/chromeos/run_all_unittests.cc
index 37cec4a..7fa086e 100644
--- a/chromeos/run_all_unittests.cc
+++ b/chromeos/run_all_unittests.cc
@@ -5,11 +5,11 @@
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   // Some unit tests make Mojo calls.
-  mojo::edk::Init();
+  mojo::core::Init();
 
   base::TestSuite test_suite(argc, argv);
   return base::LaunchUnitTests(
diff --git a/components/assist_ranker/base_predictor_unittest.cc b/components/assist_ranker/base_predictor_unittest.cc
index aae8262..5b770768 100644
--- a/components/assist_ranker/base_predictor_unittest.cc
+++ b/components/assist_ranker/base_predictor_unittest.cc
@@ -100,8 +100,8 @@
 class BasePredictorTest : public ::testing::Test {
  protected:
   BasePredictorTest() = default;
-  // Disables Query for the test predictor.
-  void DisableQuery();
+
+  void SetUp() override;
 
   ukm::SourceId GetSourceId();
 
@@ -120,16 +120,17 @@
   DISALLOW_COPY_AND_ASSIGN(BasePredictorTest);
 };
 
+void BasePredictorTest::SetUp() {
+  ::testing::Test::SetUp();
+  scoped_feature_list_.Init();
+}
+
 ukm::SourceId BasePredictorTest::GetSourceId() {
   ukm::SourceId source_id = ukm::UkmRecorder::GetNewSourceID();
   test_ukm_recorder_.UpdateSourceURL(source_id, GURL(kTestNavigationUrl));
   return source_id;
 }
 
-void BasePredictorTest::DisableQuery() {
-  scoped_feature_list_.InitWithFeatures({}, {kTestRankerQuery});
-}
-
 TEST_F(BasePredictorTest, BaseTest) {
   auto predictor = FakePredictor::Create();
   EXPECT_EQ(kTestModelName, predictor->GetModelName());
@@ -139,7 +140,8 @@
 }
 
 TEST_F(BasePredictorTest, QueryDisabled) {
-  DisableQuery();
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndDisableFeature(kTestRankerQuery);
   auto predictor = FakePredictor::Create();
   EXPECT_EQ(kTestModelName, predictor->GetModelName());
   EXPECT_EQ(kTestDefaultModelUrl, predictor->GetModelUrl());
diff --git a/components/assist_ranker/binary_classifier_predictor_unittest.cc b/components/assist_ranker/binary_classifier_predictor_unittest.cc
index dcde981..672c80f 100644
--- a/components/assist_ranker/binary_classifier_predictor_unittest.cc
+++ b/components/assist_ranker/binary_classifier_predictor_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/feature_list.h"
+#include "base/test/scoped_feature_list.h"
 #include "components/assist_ranker/fake_ranker_model_loader.h"
 #include "components/assist_ranker/proto/ranker_model.pb.h"
 #include "components/assist_ranker/ranker_model.h"
@@ -20,6 +21,8 @@
 
 class BinaryClassifierPredictorTest : public ::testing::Test {
  public:
+  void SetUp() override;
+
   std::unique_ptr<BinaryClassifierPredictor> InitPredictor(
       std::unique_ptr<RankerModel> ranker_model,
       const PredictorConfig& config);
@@ -33,8 +36,14 @@
   const std::string feature_ = "feature";
   const float weight_ = 1.0;
   const float threshold_ = 0.5;
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
+void BinaryClassifierPredictorTest::SetUp() {
+  ::testing::Test::SetUp();
+  scoped_feature_list_.Init();
+}
+
 std::unique_ptr<BinaryClassifierPredictor>
 BinaryClassifierPredictorTest::InitPredictor(
     std::unique_ptr<RankerModel> ranker_model,
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 8b59c49..8e171b0 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -531,3 +531,18 @@
     ":password_generator_fips181",
   ]
 }
+
+if (use_libfuzzer) {
+  fuzzer_test("form_structure_process_query_response_fuzzer") {
+    sources = [
+      "form_structure_process_query_response_fuzzer.cc",
+    ]
+    deps = [
+      ":browser",
+      "//base:base",
+      "//components/autofill/core/browser/proto",
+      "//components/autofill/core/common",
+      "//third_party/libprotobuf-mutator",
+    ]
+  }
+}
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index e1703b2c..31d4d13 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -520,6 +520,13 @@
 
   VLOG(1) << "Autofill query response was successfully parsed:\n" << response;
 
+  ProcessQueryResponse(response, forms);
+}
+
+// static
+void FormStructure::ProcessQueryResponse(
+    const AutofillQueryResponseContents& response,
+    const std::vector<FormStructure*>& forms) {
   AutofillMetrics::LogServerQueryMetric(AutofillMetrics::QUERY_RESPONSE_PARSED);
 
   bool heuristics_detected_fillable_field = false;
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h
index b85bed7..6f2114e2 100644
--- a/components/autofill/core/browser/form_structure.h
+++ b/components/autofill/core/browser/form_structure.h
@@ -81,11 +81,17 @@
                                  std::vector<std::string>* encoded_signatures,
                                  autofill::AutofillQueryContents* query);
 
-  // Parses the field types from the server query response. |forms| must be the
-  // same as the one passed to EncodeQueryRequest when constructing the query.
+  // Parses response as AutofillQueryResponseContents proto and calls
+  // ProcessQueryResponse.
   static void ParseQueryResponse(std::string response,
                                  const std::vector<FormStructure*>& forms);
 
+  // Parses the field types from the server query response. |forms| must be the
+  // same as the one passed to EncodeQueryRequest when constructing the query.
+  static void ProcessQueryResponse(
+      const AutofillQueryResponseContents& response,
+      const std::vector<FormStructure*>& forms);
+
   // Returns predictions using the details from the given |form_structures| and
   // their fields' predicted types.
   static std::vector<FormDataPredictions> GetFieldTypePredictions(
diff --git a/components/autofill/core/browser/form_structure_process_query_response_fuzzer.cc b/components/autofill/core/browser/form_structure_process_query_response_fuzzer.cc
new file mode 100644
index 0000000..9f88a2f
--- /dev/null
+++ b/components/autofill/core/browser/form_structure_process_query_response_fuzzer.cc
@@ -0,0 +1,50 @@
+// 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 <stdlib.h>
+
+#include <iostream>
+
+#include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/form_structure.h"
+#include "components/autofill/core/common/form_data.h"
+#include "components/autofill/core/common/form_field_data.h"
+#include "testing/libfuzzer/proto/lpm_interface.h"
+
+namespace autofill {
+namespace {
+
+using ::base::ASCIIToUTF16;
+
+void AddField(const std::string& label,
+              const std::string& name,
+              const std::string& control_type,
+              FormData* form_data) {
+  FormFieldData field;
+  field.label = ASCIIToUTF16(label);
+  field.name = ASCIIToUTF16(name);
+  field.form_control_type = control_type;
+
+  form_data->fields.push_back(field);
+}
+
+// We run ProcessQueryResponse twice with hardcoded forms vectors. Ideally we
+// should also generate forms vectors by using fuzzing, but at the moment we use
+// simplified approach. There is no specific reason to use those two hardcoded
+// forms vectors, so it can be changed if needed.
+DEFINE_BINARY_PROTO_FUZZER(const AutofillQueryResponseContents& response) {
+  std::vector<FormStructure*> forms;
+  FormStructure::ProcessQueryResponse(response, forms);
+
+  FormData form_data;
+  AddField("username", "username", "text", &form_data);
+  AddField("password", "password", "password", &form_data);
+
+  FormStructure form(form_data);
+  forms.push_back(&form);
+  FormStructure::ProcessQueryResponse(response, forms);
+}
+
+}  // namespace
+}  // namespace autofill
diff --git a/components/autofill/core/browser/proto/BUILD.gn b/components/autofill/core/browser/proto/BUILD.gn
index c6cb42e..5fad7b4 100644
--- a/components/autofill/core/browser/proto/BUILD.gn
+++ b/components/autofill/core/browser/proto/BUILD.gn
@@ -11,4 +11,17 @@
     "password_requirements_shard.proto",
     "server.proto",
   ]
+
+  # It's necessary for fuzzing, because fuzzers aren't compatible with optimize_for = LITE_RUNTIME;
+  if (use_libfuzzer && current_toolchain == host_toolchain) {
+    generator_plugin_label =
+        "//third_party/libprotobuf-mutator:override_lite_runtime_plugin"
+    generator_plugin_suffix = ".pb"
+
+    # The plugin will generate cc, so don't ask for it to be done by protoc.
+    generate_cc = false
+    deps = [
+      "//third_party/libprotobuf-mutator:override_lite_runtime_plugin",
+    ]
+  }
 }
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc
index 6324d96..6a78faf9 100644
--- a/components/browser_sync/profile_sync_components_factory_impl.cc
+++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -13,6 +13,7 @@
 #include "components/autofill/core/browser/autofill_wallet_data_type_controller.h"
 #include "components/autofill/core/browser/webdata/autocomplete_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_profile_data_type_controller.h"
+#include "components/autofill/core/browser/webdata/autofill_profile_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/autofill/core/browser/webdata/web_data_model_type_controller.h"
 #include "components/browser_sync/browser_sync_switches.h"
@@ -58,18 +59,30 @@
 
 namespace {
 
-// This helper function only wraps
-// autofill::AutocompleteSyncBridge::FromWebDataService(). This way, it
-// simplifies life for the compiler which cannot directly cast
+// These helper functions only wrap the factory functions of the bridges. This
+// way, it simplifies life for the compiler which cannot directly cast
 // "WeakPtr<ModelTypeSyncBridge> (AutofillWebDataService*)" to
 // "WeakPtr<ModelTypeControllerDelegate> (AutofillWebDataService*)".
-base::WeakPtr<syncer::ModelTypeControllerDelegate> DelegateFromDataService(
-    autofill::AutofillWebDataService* service) {
+base::WeakPtr<syncer::ModelTypeControllerDelegate>
+AutocompleteDelegateFromDataService(autofill::AutofillWebDataService* service) {
+  // TODO(jkrcal): Deal with the (probably rare) race condition when we call
+  // bridges' FromWebDataService() before calling
+  // CreateForWebDataServiceAndBackend() in WebDataServiceWrapper. This TODO
+  // also applies to the second function below and to analogous code in
+  // SyncClient::GetControllerDelegateForModelType().
   return autofill::AutocompleteSyncBridge::FromWebDataService(service)
       ->change_processor()
       ->GetControllerDelegateOnUIThread();
 }
 
+base::WeakPtr<syncer::ModelTypeControllerDelegate>
+AutofillProfileDelegateFromDataService(
+    autofill::AutofillWebDataService* service) {
+  return autofill::AutofillProfileSyncBridge::FromWebDataService(service)
+      ->change_processor()
+      ->GetControllerDelegateOnUIThread();
+}
+
 }  // namespace
 
 ProfileSyncComponentsFactoryImpl::ProfileSyncComponentsFactoryImpl(
@@ -115,14 +128,23 @@
       controllers.push_back(
           std::make_unique<autofill::WebDataModelTypeController>(
               syncer::AUTOFILL, sync_client_, db_thread_, web_data_service_,
-              base::BindRepeating(&DelegateFromDataService)));
+              base::BindRepeating(&AutocompleteDelegateFromDataService)));
     }
 
     // Autofill sync is enabled by default.  Register unless explicitly
     // disabled.
     if (!disabled_types.Has(syncer::AUTOFILL_PROFILE)) {
-      controllers.push_back(std::make_unique<AutofillProfileDataTypeController>(
-          db_thread_, error_callback, sync_client_, web_data_service_));
+      if (FeatureList::IsEnabled(switches::kSyncUSSAutofillProfile)) {
+        controllers.push_back(
+            std::make_unique<autofill::WebDataModelTypeController>(
+                syncer::AUTOFILL_PROFILE, sync_client_, db_thread_,
+                web_data_service_,
+                base::BindRepeating(&AutofillProfileDelegateFromDataService)));
+      } else {
+        controllers.push_back(
+            std::make_unique<AutofillProfileDataTypeController>(
+                db_thread_, error_callback, sync_client_, web_data_service_));
+      }
     }
 
     // Wallet data sync is enabled by default, but behind a syncer experiment
diff --git a/components/cast_channel/cast_socket.cc b/components/cast_channel/cast_socket.cc
index 5ef5fb1..8c91caa 100644
--- a/components/cast_channel/cast_socket.cc
+++ b/components/cast_channel/cast_socket.cc
@@ -78,7 +78,7 @@
   int Verify(const RequestParams& params,
              net::CRLSet*,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback&,
+             net::CompletionOnceCallback,
              std::unique_ptr<Request>*,
              const net::NetLogWithSource&) override {
     verify_result->Reset();
diff --git a/components/cronet/ios/Cronet.mm b/components/cronet/ios/Cronet.mm
index 337ee5cd..6f061d1 100644
--- a/components/cronet/ios/Cronet.mm
+++ b/components/cronet/ios/Cronet.mm
@@ -78,7 +78,7 @@
   int Verify(const RequestParams& params,
              net::CRLSet* crl_set,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback& callback,
+             net::CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const net::NetLogWithSource& net_log) override {
     net::Error result = net::OK;
diff --git a/components/exo/BUILD.gn b/components/exo/BUILD.gn
index be7d79a..b566ab631 100644
--- a/components/exo/BUILD.gn
+++ b/components/exo/BUILD.gn
@@ -200,7 +200,7 @@
     "//cc:test_support",
     "//components/viz/test:test_support",
     "//device/gamepad:test_helpers",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//testing/gtest",
     "//ui/aura",
     "//ui/aura:test_support",
diff --git a/components/exo/DEPS b/components/exo/DEPS
index 4f81d0e..2fc1da6 100644
--- a/components/exo/DEPS
+++ b/components/exo/DEPS
@@ -15,7 +15,7 @@
 
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder/embedder.h",
+    "+mojo/core/embedder/embedder.h",
   ],
 
   "surface_unittest\.cc": [
diff --git a/components/exo/test/run_all_unittests.cc b/components/exo/test/run_all_unittests.cc
index ffa9439..5fd0905 100644
--- a/components/exo/test/run_all_unittests.cc
+++ b/components/exo/test/run_all_unittests.cc
@@ -7,14 +7,14 @@
 #include "base/test/launcher/unit_test_launcher.h"
 
 #if !defined(OS_IOS)
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #endif
 
 int main(int argc, char** argv) {
   ash::AshTestSuite test_suite(argc, argv);
 
 #if !defined(OS_IOS)
-  mojo::edk::Init();
+  mojo::core::Init();
 #endif
 
   return base::LaunchUnitTestsSerially(
diff --git a/components/exo/wayland/BUILD.gn b/components/exo/wayland/BUILD.gn
index 25def53..4000a2b 100644
--- a/components/exo/wayland/BUILD.gn
+++ b/components/exo/wayland/BUILD.gn
@@ -311,7 +311,7 @@
     "//cc:test_support",
     "//components/exo",
     "//components/viz/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//testing/perf",
     "//ui/aura",
     "//ui/aura:test_support",
diff --git a/components/exo/wayland/clients/test/DEPS b/components/exo/wayland/clients/test/DEPS
index f73d72e..65253a77 100644
--- a/components/exo/wayland/clients/test/DEPS
+++ b/components/exo/wayland/clients/test/DEPS
@@ -1,5 +1,5 @@
 specific_include_rules = {
   "run_all_client_perftests\.cc": [
-    "+mojo/edk/embedder/embedder.h",
+    "+mojo/core/embedder/embedder.h",
   ],
 }
diff --git a/components/exo/wayland/clients/test/run_all_client_perftests.cc b/components/exo/wayland/clients/test/run_all_client_perftests.cc
index cbaae56..1f523c8 100644
--- a/components/exo/wayland/clients/test/run_all_client_perftests.cc
+++ b/components/exo/wayland/clients/test/run_all_client_perftests.cc
@@ -14,7 +14,7 @@
 #include "base/threading/thread.h"
 #include "build/build_config.h"
 #include "components/exo/wayland/clients/test/wayland_client_test.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 namespace exo {
 namespace {
@@ -107,7 +107,7 @@
 }  // namespace exo
 
 int main(int argc, char** argv) {
-  mojo::edk::Init();
+  mojo::core::Init();
 
   exo::ExoClientPerfTestSuite test_suite(argc, argv);
 
diff --git a/components/json_schema/OWNERS b/components/json_schema/OWNERS
index 33e2bce4..6f52886 100644
--- a/components/json_schema/OWNERS
+++ b/components/json_schema/OWNERS
@@ -1,2 +1,2 @@
-asargent@chromium.org
-calamity@chromium.org
+emaxx@chromium.org
+ljusten@chromium.org
diff --git a/components/metrics/call_stack_profile_builder.cc b/components/metrics/call_stack_profile_builder.cc
index aeb833d..f308c93 100644
--- a/components/metrics/call_stack_profile_builder.cc
+++ b/components/metrics/call_stack_profile_builder.cc
@@ -6,10 +6,40 @@
 
 #include <utility>
 
+#include "base/atomicops.h"
 #include "base/logging.h"
 
 using StackSamplingProfiler = base::StackSamplingProfiler;
 
+namespace metrics {
+
+namespace {
+
+// This global variables holds the current system state and is recorded with
+// every captured sample, done on a separate thread which is why updates to
+// this must be atomic. A PostTask to move the the updates to that thread
+// would skew the timing and a lock could result in deadlock if the thread
+// making a change was also being profiled and got stopped.
+static base::subtle::Atomic32 g_process_milestones = 0;
+
+void ChangeAtomicFlags(base::subtle::Atomic32* flags,
+                       base::subtle::Atomic32 set,
+                       base::subtle::Atomic32 clear) {
+  DCHECK(set != 0 || clear != 0);
+  DCHECK_EQ(0, set & clear);
+
+  base::subtle::Atomic32 bits = base::subtle::NoBarrier_Load(flags);
+  while (true) {
+    base::subtle::Atomic32 existing = base::subtle::NoBarrier_CompareAndSwap(
+        flags, bits, (bits | set) & ~clear);
+    if (existing == bits)
+      break;
+    bits = existing;
+  }
+}
+
+}  // namespace
+
 CallStackProfileBuilder::CallStackProfileBuilder(
     const CompletedCallback& callback)
     : callback_(callback) {}
@@ -20,7 +50,8 @@
   // The code inside this method must not do anything that could acquire a
   // mutex, including allocating memory (which includes LOG messages) because
   // that mutex could be held by a stopped thread, thus resulting in deadlock.
-  sample_.process_milestones = StackSamplingProfiler::ProcessMilestone();
+  sample_.process_milestones =
+      base::subtle::NoBarrier_Load(&g_process_milestones);
 }
 
 void CallStackProfileBuilder::OnSampleCompleted(
@@ -61,4 +92,15 @@
 
   // Run the associated callback, passing the collected profile.
   callback_.Run(std::move(profile_));
-}
\ No newline at end of file
+}
+
+// static
+void CallStackProfileBuilder::SetProcessMilestone(int milestone) {
+  DCHECK_LE(0, milestone);
+  DCHECK_GT(static_cast<int>(sizeof(g_process_milestones) * 8), milestone);
+  DCHECK_EQ(0, base::subtle::NoBarrier_Load(&g_process_milestones) &
+                   (1 << milestone));
+  ChangeAtomicFlags(&g_process_milestones, 1 << milestone, 0);
+}
+
+}  // namespace metrics
diff --git a/components/metrics/call_stack_profile_builder.h b/components/metrics/call_stack_profile_builder.h
index 8eb7e01..ec01592 100644
--- a/components/metrics/call_stack_profile_builder.h
+++ b/components/metrics/call_stack_profile_builder.h
@@ -11,6 +11,8 @@
 
 #include "base/callback.h"
 
+namespace metrics {
+
 // CallStackProfileBuilder builds a CallStackProfile from the collected sampling
 // data.
 //
@@ -46,6 +48,14 @@
   void OnProfileCompleted(base::TimeDelta profile_duration,
                           base::TimeDelta sampling_period) override;
 
+  // Sets the current system state that is recorded with each captured stack
+  // frame. This is thread-safe so can be called from anywhere. The parameter
+  // value should be from an enumeration of the appropriate type with values
+  // ranging from 0 to 31, inclusive. This sets bits within Sample field of
+  // |process_milestones|. The actual meanings of these bits are defined
+  // (globally) by the caller(s).
+  static void SetProcessMilestone(int milestone);
+
  private:
   // The collected stack samples.
   base::StackSamplingProfiler::CallStackProfile profile_;
@@ -62,4 +72,6 @@
   DISALLOW_COPY_AND_ASSIGN(CallStackProfileBuilder);
 };
 
+}  // namespace metrics
+
 #endif  // COMPONENTS_METRICS_CALL_STACK_PROFILE_BUILDER_H_
diff --git a/components/metrics/call_stack_profile_builder_unittest.cc b/components/metrics/call_stack_profile_builder_unittest.cc
index 8816b6c..93ff7cc 100644
--- a/components/metrics/call_stack_profile_builder_unittest.cc
+++ b/components/metrics/call_stack_profile_builder_unittest.cc
@@ -14,6 +14,8 @@
 using InternalModule = StackSamplingProfiler::InternalModule;
 using CallStackProfile = StackSamplingProfiler::CallStackProfile;
 
+namespace metrics {
+
 namespace {
 
 // Called on the profiler thread when complete, to collect profile.
@@ -34,7 +36,7 @@
   profile_builder->RecordAnnotations();
   profile_builder->OnSampleCompleted(std::vector<InternalFrame>());
 
-  StackSamplingProfiler::SetProcessMilestone(1);
+  CallStackProfileBuilder::SetProcessMilestone(1);
   profile_builder->RecordAnnotations();
   profile_builder->OnSampleCompleted(std::vector<InternalFrame>());
 
@@ -153,3 +155,5 @@
   EXPECT_EQ(0u, profile.samples[0].frames[0].module_index);
   EXPECT_EQ(0u, profile.samples[0].frames[1].module_index);
 }
+
+}  // namespace metrics
diff --git a/components/metrics/call_stack_profile_metrics_provider.h b/components/metrics/call_stack_profile_metrics_provider.h
index 44b3431..4b05c4e 100644
--- a/components/metrics/call_stack_profile_metrics_provider.h
+++ b/components/metrics/call_stack_profile_metrics_provider.h
@@ -21,8 +21,9 @@
 class CallStackProfileMetricsProvider : public MetricsProvider {
  public:
   // These milestones of a process lifetime can be passed as process "mile-
-  // stones" to StackSmaplingProfile::SetProcessMilestone(). Be sure to update
-  // the translation constants at the top of the .cc file when this is changed.
+  // stones" to CallStackProfileBuilder::SetProcessMilestone(). Be sure to
+  // update the translation constants at the top of the .cc file when this is
+  // changed.
   enum Milestones : int {
     MAIN_LOOP_START,
     MAIN_NAVIGATION_START,
diff --git a/components/metrics/public/cpp/OWNERS b/components/metrics/public/cpp/OWNERS
index 9e7bd07..2c44a46 100644
--- a/components/metrics/public/cpp/OWNERS
+++ b/components/metrics/public/cpp/OWNERS
@@ -2,5 +2,5 @@
 per-file *.mojom=file://ipc/SECURITY_OWNERS
 per-file *_struct_traits*.*=set noparent
 per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS
-per-file *.typemap=set noparent

+per-file *.typemap=set noparent
 per-file *.typemap=file://ipc/SECURITY_OWNERS
diff --git a/components/nacl/common/BUILD.gn b/components/nacl/common/BUILD.gn
index 8f9ef992..5e0c304 100644
--- a/components/nacl/common/BUILD.gn
+++ b/components/nacl/common/BUILD.gn
@@ -37,7 +37,7 @@
       "//base",
       "//base:base_static",
       "//content/public/common:service_names",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//services/service_manager/public/cpp",
     ]
   }
diff --git a/components/nacl/common/DEPS b/components/nacl/common/DEPS
index ce8ebd49..f09fadf7 100644
--- a/components/nacl/common/DEPS
+++ b/components/nacl/common/DEPS
@@ -1,7 +1,7 @@
 include_rules = [
   "+native_client/src/public",
   "+native_client/src/trusted/service_runtime/nacl_error_code.h",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+mojo/public",
   "+services/service_manager/sandbox",
 ]
diff --git a/components/nacl/common/nacl_service.cc b/components/nacl/common/nacl_service.cc
index a5a8d51..fac2b59 100644
--- a/components/nacl/common/nacl_service.cc
+++ b/components/nacl/common/nacl_service.cc
@@ -10,7 +10,7 @@
 #include "base/command_line.h"
 #include "content/public/common/service_names.mojom.h"
 #include "ipc/ipc.mojom.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel_endpoint.h"
@@ -58,7 +58,7 @@
 class NaClService : public service_manager::Service {
  public:
   NaClService(IPC::mojom::ChannelBootstrapPtrInfo bootstrap,
-              std::unique_ptr<mojo::edk::ScopedIPCSupport> ipc_support);
+              std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support);
   ~NaClService() override;
 
   // Service overrides.
@@ -68,13 +68,13 @@
 
  private:
   IPC::mojom::ChannelBootstrapPtrInfo ipc_channel_bootstrap_;
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
   bool connected_ = false;
 };
 
 NaClService::NaClService(
     IPC::mojom::ChannelBootstrapPtrInfo bootstrap,
-    std::unique_ptr<mojo::edk::ScopedIPCSupport> ipc_support)
+    std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support)
     : ipc_channel_bootstrap_(std::move(bootstrap)),
       ipc_support_(std::move(ipc_support)) {}
 
@@ -100,9 +100,9 @@
 std::unique_ptr<service_manager::ServiceContext> CreateNaClServiceContext(
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
     mojo::ScopedMessagePipeHandle* ipc_channel) {
-  auto ipc_support = std::make_unique<mojo::edk::ScopedIPCSupport>(
+  auto ipc_support = std::make_unique<mojo::core::ScopedIPCSupport>(
       std::move(io_task_runner),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
   auto invitation = EstablishMojoConnection();
   IPC::mojom::ChannelBootstrapPtr bootstrap;
   *ipc_channel = mojo::MakeRequest(&bootstrap).PassMessagePipe();
diff --git a/components/nacl/loader/BUILD.gn b/components/nacl/loader/BUILD.gn
index 9a61de6b..cdf2ffa 100644
--- a/components/nacl/loader/BUILD.gn
+++ b/components/nacl/loader/BUILD.gn
@@ -36,7 +36,7 @@
     "//components/nacl/common:mojo_bindings",
     "//crypto",
     "//ipc",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//native_client/src/trusted/service_runtime:sel_main_chrome",
     "//ppapi/c",
     "//ppapi/proxy:ipc",
@@ -129,7 +129,7 @@
       "//content/public/common",
       "//crypto",
       "//ipc",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//sandbox/linux:sandbox_services",
       "//services/service_manager/sandbox",
       "//services/service_manager/zygote",
@@ -216,7 +216,7 @@
       "//components/nacl/broker",
       "//components/nacl/common:switches",
       "//content/public/common:static_switches",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//sandbox",
       "//services/service_manager/sandbox:sandbox",
     ]
@@ -246,7 +246,7 @@
       "//components/tracing",
       "//content",
       "//ipc",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//native_client/src/nonsfi/irt:nacl_sys_private",
       "//native_client/src/nonsfi/loader:elf_loader",
 
diff --git a/components/nacl/loader/DEPS b/components/nacl/loader/DEPS
index ca1a3bc..557a65a 100644
--- a/components/nacl/loader/DEPS
+++ b/components/nacl/loader/DEPS
@@ -14,7 +14,7 @@
   "+services/service_manager/sandbox",
   "+ppapi/c",  # header files only
 
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
 
   "+native_client/src/include",
   "+native_client/src/public",
diff --git a/components/nacl/loader/nacl_helper_linux.cc b/components/nacl/loader/nacl_helper_linux.cc
index 50230ec..97bc556 100644
--- a/components/nacl/loader/nacl_helper_linux.cc
+++ b/components/nacl/loader/nacl_helper_linux.cc
@@ -35,7 +35,7 @@
 #include "build/build_config.h"
 #include "components/nacl/common/nacl_switches.h"
 #include "components/nacl/loader/sandbox_linux/nacl_sandbox_linux.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "sandbox/linux/services/credentials.h"
 #include "sandbox/linux/services/namespace_sandbox.h"
 #include "services/service_manager/embedder/descriptors.h"
@@ -119,7 +119,7 @@
                                               browser_fd.release());
 
   // The Mojo EDK must be initialized before using IPC.
-  mojo::edk::Init();
+  mojo::core::Init();
 
   base::MessageLoopForIO main_message_loop;
 #if defined(OS_NACL_NONSFI)
diff --git a/components/nacl/loader/nacl_helper_win_64.cc b/components/nacl/loader/nacl_helper_win_64.cc
index 6578e8ba..be9ad77 100644
--- a/components/nacl/loader/nacl_helper_win_64.cc
+++ b/components/nacl/loader/nacl_helper_win_64.cc
@@ -25,7 +25,7 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/common/main_function_params.h"
 #include "content/public/common/sandbox_init.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "sandbox/win/src/sandbox_types.h"
 #include "services/service_manager/sandbox/sandbox.h"
 
@@ -38,7 +38,7 @@
   base::MessageLoopForIO main_message_loop;
   base::PlatformThread::SetName("CrNaClBrokerMain");
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   std::unique_ptr<base::PowerMonitorSource> power_monitor_source(
       new base::PowerMonitorDeviceSource());
diff --git a/components/nacl/loader/nacl_main.cc b/components/nacl/loader/nacl_main.cc
index cdd74ca..b4c3bf6 100644
--- a/components/nacl/loader/nacl_main.cc
+++ b/components/nacl/loader/nacl_main.cc
@@ -13,7 +13,7 @@
 #include "components/nacl/loader/nacl_listener.h"
 #include "components/nacl/loader/nacl_main_platform_delegate.h"
 #include "content/public/common/main_function_params.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "services/service_manager/sandbox/switches.h"
 
 // main() routine for the NaCl loader process.
@@ -21,7 +21,7 @@
   const base::CommandLine& parsed_command_line = parameters.command_line;
 
   // The Mojo EDK must be initialized before using IPC.
-  mojo::edk::Init();
+  mojo::core::Init();
 
   // The main thread of the plugin services IO.
   base::MessageLoopForIO main_message_loop;
diff --git a/components/startup_metric_utils/browser/startup_metric_utils.cc b/components/startup_metric_utils/browser/startup_metric_utils.cc
index a40cda4..cc7d005 100644
--- a/components/startup_metric_utils/browser/startup_metric_utils.cc
+++ b/components/startup_metric_utils/browser/startup_metric_utils.cc
@@ -17,12 +17,12 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/process/process_info.h"
-#include "base/profiler/stack_sampling_profiler.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/sys_info.h"
 #include "base/threading/platform_thread.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
+#include "components/metrics/call_stack_profile_builder.h"
 #include "components/metrics/call_stack_profile_metrics_provider.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
@@ -576,7 +576,7 @@
   RecordHardFaultHistogram();
 
   // Record timing of the browser message-loop start time.
-  base::StackSamplingProfiler::SetProcessMilestone(
+  metrics::CallStackProfileBuilder::SetProcessMilestone(
       metrics::CallStackProfileMetricsProvider::MAIN_LOOP_START);
   if (!is_first_run && !g_process_creation_ticks.is_null()) {
     UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
@@ -683,7 +683,7 @@
   if (!ShouldLogStartupHistogram())
     return;
 
-  base::StackSamplingProfiler::SetProcessMilestone(
+  metrics::CallStackProfileBuilder::SetProcessMilestone(
       metrics::CallStackProfileMetricsProvider::FIRST_NONEMPTY_PAINT);
   UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
       UMA_HISTOGRAM_LONG_TIMES_100, "Startup.FirstWebContents.NonEmptyPaint2",
@@ -708,7 +708,7 @@
   if (!ShouldLogStartupHistogram())
     return;
 
-  base::StackSamplingProfiler::SetProcessMilestone(
+  metrics::CallStackProfileBuilder::SetProcessMilestone(
       metrics::CallStackProfileMetricsProvider::MAIN_NAVIGATION_START);
   UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
       UMA_HISTOGRAM_LONG_TIMES_100,
@@ -739,7 +739,7 @@
   if (!ShouldLogStartupHistogram())
     return;
 
-  base::StackSamplingProfiler::SetProcessMilestone(
+  metrics::CallStackProfileBuilder::SetProcessMilestone(
       metrics::CallStackProfileMetricsProvider::MAIN_NAVIGATION_FINISHED);
   UMA_HISTOGRAM_AND_TRACE_WITH_TEMPERATURE_AND_SAME_VERSION_COUNT(
       UMA_HISTOGRAM_LONG_TIMES_100,
diff --git a/components/sync/driver/sync_driver_switches.cc b/components/sync/driver/sync_driver_switches.cc
index c9d5a08..8ebc3e3 100644
--- a/components/sync/driver/sync_driver_switches.cc
+++ b/components/sync/driver/sync_driver_switches.cc
@@ -70,4 +70,8 @@
 const base::Feature kSyncUSSSessions{"SyncUSSSessions",
                                      base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Enable USS implementation of autofill profile datatype.
+const base::Feature kSyncUSSAutofillProfile{"SyncUSSAutofillProfile",
+                                            base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace switches
diff --git a/components/sync/driver/sync_driver_switches.h b/components/sync/driver/sync_driver_switches.h
index 9e74b2e..77c3e17 100644
--- a/components/sync/driver/sync_driver_switches.h
+++ b/components/sync/driver/sync_driver_switches.h
@@ -28,6 +28,7 @@
 extern const base::Feature kSyncUserTranslationEvents;
 extern const base::Feature kSyncUSSBookmarks;
 extern const base::Feature kSyncUSSSessions;
+extern const base::Feature kSyncUSSAutofillProfile;
 
 }  // namespace switches
 
diff --git a/components/test/BUILD.gn b/components/test/BUILD.gn
index 247a3f78..1609424 100644
--- a/components/test/BUILD.gn
+++ b/components/test/BUILD.gn
@@ -18,7 +18,7 @@
     "//components/content_settings/core/common",
     "//components/gcm_driver:gcm_driver",
     "//components/signin/core/browser",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net",
     "//testing/gtest",
     "//ui/base",
diff --git a/components/test/DEPS b/components/test/DEPS
index 1ea0d3d4..27fad75 100644
--- a/components/test/DEPS
+++ b/components/test/DEPS
@@ -12,6 +12,6 @@
 
 specific_include_rules = {
   "components_test_suite\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ],
 }
diff --git a/components/test/components_test_suite.cc b/components/test/components_test_suite.cc
index 01da389..f21e491b 100644
--- a/components/test/components_test_suite.cc
+++ b/components/test/components_test_suite.cc
@@ -15,7 +15,7 @@
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
@@ -48,7 +48,7 @@
   void Initialize() override {
     base::TestSuite::Initialize();
 
-    mojo::edk::Init();
+    mojo::core::Init();
 
     // Before registering any schemes, clear GURL's internal state.
     url::Shutdown();
diff --git a/components/viz/BUILD.gn b/components/viz/BUILD.gn
index 4c6dd8f..636474c 100644
--- a/components/viz/BUILD.gn
+++ b/components/viz/BUILD.gn
@@ -19,7 +19,7 @@
     "//components/viz/test:test_suite",
     "//components/viz/test:test_support",
     "//components/viz/test:unit_tests",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
 
   data = [
diff --git a/components/viz/common/surfaces/local_surface_id.cc b/components/viz/common/surfaces/local_surface_id.cc
index 8fa2770..e88255d 100644
--- a/components/viz/common/surfaces/local_surface_id.cc
+++ b/components/viz/common/surfaces/local_surface_id.cc
@@ -23,4 +23,15 @@
   return out << local_surface_id.ToString();
 }
 
+bool LocalSurfaceId::IsNewerThan(const LocalSurfaceId& other) const {
+  // Sequence numbers can wrap around so look at their difference instead of
+  // their absolute values.
+  return embed_token_ == other.embed_token_ &&
+         (child_sequence_number_ - other.child_sequence_number_ < (1u << 31)) &&
+         (parent_sequence_number_ - other.parent_sequence_number_ <
+          (1u << 31)) &&
+         (child_sequence_number_ != other.child_sequence_number_ ||
+          parent_sequence_number_ != other.parent_sequence_number_);
+}
+
 }  // namespace viz
diff --git a/components/viz/common/surfaces/local_surface_id.h b/components/viz/common/surfaces/local_surface_id.h
index 1ac6d268..017ef10 100644
--- a/components/viz/common/surfaces/local_surface_id.h
+++ b/components/viz/common/surfaces/local_surface_id.h
@@ -137,6 +137,9 @@
 
   std::string ToString() const;
 
+  // Returns whether this LocalSurfaceId was generated after |other|.
+  bool IsNewerThan(const LocalSurfaceId& other) const;
+
  private:
   friend struct mojo::StructTraits<mojom::LocalSurfaceIdDataView,
                                    LocalSurfaceId>;
diff --git a/components/viz/host/hit_test/DEPS b/components/viz/host/hit_test/DEPS
index a5b0089..0c23a8bf 100644
--- a/components/viz/host/hit_test/DEPS
+++ b/components/viz/host/hit_test/DEPS
@@ -6,6 +6,6 @@
 
 specific_include_rules = {
   "hit_test_query_fuzzer.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ]
 }
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc
index 3d29e8d..591b739 100644
--- a/components/viz/service/display/display.cc
+++ b/components/viz/service/display/display.cc
@@ -294,11 +294,12 @@
   }
 
   // Run callbacks early to allow pipelining and collect presented callbacks.
-  for (const auto& id_entry : aggregator_->previous_contained_surfaces()) {
-    Surface* surface = surface_manager_->GetSurfaceForId(id_entry.first);
+  for (const auto& surface_id : surfaces_to_ack_on_next_draw_) {
+    Surface* surface = surface_manager_->GetSurfaceForId(surface_id);
     if (surface)
       surface->RunDrawCallback();
   }
+  surfaces_to_ack_on_next_draw_.clear();
 
   frame.metadata.latency_info.insert(frame.metadata.latency_info.end(),
                                      stored_latency_info_.begin(),
@@ -485,25 +486,19 @@
 
 bool Display::SurfaceDamaged(const SurfaceId& surface_id,
                              const BeginFrameAck& ack) {
+  if (!ack.has_damage)
+    return false;
   bool display_damaged = false;
-  if (ack.has_damage) {
-    if (aggregator_ &&
-        aggregator_->previous_contained_surfaces().count(surface_id)) {
-      Surface* surface = surface_manager_->GetSurfaceForId(surface_id);
-      if (surface) {
-        DCHECK(surface->HasActiveFrame());
-        if (surface->GetActiveFrame().resource_list.empty())
-          aggregator_->ReleaseResources(surface_id);
-      }
-      display_damaged = true;
-      if (surface_id == current_surface_id_)
-        UpdateRootSurfaceResourcesLocked();
-    } else if (surface_id == current_surface_id_) {
-      display_damaged = true;
-      UpdateRootSurfaceResourcesLocked();
-    }
+  if (aggregator_) {
+    display_damaged |=
+        aggregator_->NotifySurfaceDamageAndCheckForDisplayDamage(surface_id);
   }
-
+  if (surface_id == current_surface_id_) {
+    display_damaged = true;
+    UpdateRootSurfaceResourcesLocked();
+  }
+  if (display_damaged)
+    surfaces_to_ack_on_next_draw_.push_back(surface_id);
   return display_damaged;
 }
 
diff --git a/components/viz/service/display/display.h b/components/viz/service/display/display.h
index 599b66d..c88a5f7 100644
--- a/components/viz/service/display/display.h
+++ b/components/viz/service/display/display.h
@@ -166,6 +166,7 @@
   std::unique_ptr<DirectRenderer> renderer_;
   SoftwareRenderer* software_renderer_ = nullptr;
   std::vector<ui::LatencyInfo> stored_latency_info_;
+  std::vector<SurfaceId> surfaces_to_ack_on_next_draw_;
 
   base::circular_deque<std::vector<Surface::PresentedCallback>>
       pending_presented_callbacks_;
diff --git a/components/viz/service/display/surface_aggregator.cc b/components/viz/service/display/surface_aggregator.cc
index 32c195f..cf8243eb 100644
--- a/components/viz/service/display/surface_aggregator.cc
+++ b/components/viz/service/display/surface_aggregator.cc
@@ -826,12 +826,6 @@
         provider_->DestroyChild(it->second);
         surface_id_to_resource_child_id_.erase(it);
       }
-
-      // Notify client of removed surface.
-      Surface* surface_ptr = manager_->GetSurfaceForId(surface.first);
-      if (surface_ptr) {
-        surface_ptr->RunDrawCallback();
-      }
     }
   }
 }
@@ -992,6 +986,25 @@
   // referenced_surfaces_.
   referenced_surfaces_.insert(surface->surface_id());
   for (const auto& surface_info : child_surfaces) {
+    if (will_draw) {
+      // We only pick a surface between primary and fallback if both SurfaceIds
+      // are provided and they have the same FrameSinkId and embed token,
+      // otherwise the only Surface other than fallback that can be shown is the
+      // primary.
+      if (!surface_info.fallback_id ||
+          surface_info.fallback_id->frame_sink_id() !=
+              surface_info.primary_id.frame_sink_id() ||
+          surface_info.fallback_id->local_surface_id().embed_token() !=
+              surface_info.primary_id.local_surface_id().embed_token()) {
+        damage_ranges_[surface_info.primary_id.frame_sink_id()] =
+            std::make_pair(surface_info.primary_id.local_surface_id(),
+                           surface_info.primary_id.local_surface_id());
+      } else if (surface_info.fallback_id != surface_info.primary_id) {
+        damage_ranges_[surface_info.primary_id.frame_sink_id()] =
+            std::make_pair(surface_info.fallback_id->local_surface_id(),
+                           surface_info.primary_id.local_surface_id());
+      }
+    }
     Surface* child_surface = manager_->GetSurfaceForId(surface_info.primary_id);
     gfx::Rect surface_damage;
     if (!child_surface || !child_surface->HasActiveFrame()) {
@@ -1178,6 +1191,7 @@
 
   valid_surfaces_.clear();
   has_cached_render_passes_ = false;
+  damage_ranges_.clear();
   PrewalkResult prewalk_result;
   root_damage_rect_ =
       PrewalkTree(surface, false, 0, true /* will_draw */, &prewalk_result);
@@ -1275,4 +1289,27 @@
                             : gfx::ColorSpace::CreateSRGB();
 }
 
+bool SurfaceAggregator::NotifySurfaceDamageAndCheckForDisplayDamage(
+    const SurfaceId& surface_id) {
+  if (previous_contained_surfaces_.count(surface_id)) {
+    Surface* surface = manager_->GetSurfaceForId(surface_id);
+    if (surface) {
+      DCHECK(surface->HasActiveFrame());
+      if (surface->GetActiveFrame().resource_list.empty())
+        ReleaseResources(surface_id);
+    }
+    return true;
+  }
+
+  auto it = damage_ranges_.find(surface_id.frame_sink_id());
+  if (it == damage_ranges_.end())
+    return false;
+
+  const LocalSurfaceId& fallback = it->second.first;
+  const LocalSurfaceId& primary = it->second.second;
+  return (primary == surface_id.local_surface_id()) ||
+         (primary.IsNewerThan(surface_id.local_surface_id()) &&
+          surface_id.local_surface_id().IsNewerThan(fallback));
+}
+
 }  // namespace viz
diff --git a/components/viz/service/display/surface_aggregator.h b/components/viz/service/display/surface_aggregator.h
index 14b4bfe9..877fee4 100644
--- a/components/viz/service/display/surface_aggregator.h
+++ b/components/viz/service/display/surface_aggregator.h
@@ -54,6 +54,8 @@
   void SetOutputColorSpace(const gfx::ColorSpace& blending_color_space,
                            const gfx::ColorSpace& output_color_space);
 
+  bool NotifySurfaceDamageAndCheckForDisplayDamage(const SurfaceId& surface_id);
+
  private:
   struct ClipData {
     ClipData() : is_clipped(false) {}
@@ -278,6 +280,11 @@
   // Tracks UMA stats for SurfaceDrawQuads during a call to Aggregate().
   SurfaceDrawQuadUmaStats uma_stats_;
 
+  // For each FrameSinkId, contains a range of LocalSurfaceIds that will damage
+  // the display if they're damaged.
+  base::flat_map<FrameSinkId, std::pair<LocalSurfaceId, LocalSurfaceId>>
+      damage_ranges_;
+
   base::WeakPtrFactory<SurfaceAggregator> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(SurfaceAggregator);
diff --git a/components/viz/service/display/surface_aggregator_unittest.cc b/components/viz/service/display/surface_aggregator_unittest.cc
index e414c3f..098963b 100644
--- a/components/viz/service/display/surface_aggregator_unittest.cc
+++ b/components/viz/service/display/surface_aggregator_unittest.cc
@@ -2625,6 +2625,215 @@
   }
 }
 
+// Verifies that damage to any surface between primary and fallback damages the
+// display if primary and fallback have the FrameSinkId.
+TEST_F(SurfaceAggregatorValidSurfaceTest, SurfaceDamageSameFrameSinkId) {
+  auto embedded_support = std::make_unique<CompositorFrameSinkSupport>(
+      nullptr, &manager_, kArbitraryFrameSinkId1, kRootIsRoot,
+      kNeedsSyncPoints);
+  LocalSurfaceId id1 = allocator_.GenerateId();
+  LocalSurfaceId id2 = allocator_.GenerateId();
+  LocalSurfaceId id3 = allocator_.GenerateId();
+  LocalSurfaceId id4 = allocator_.GenerateId();
+  LocalSurfaceId id5 = allocator_.GenerateId();
+  SurfaceId fallback_surface_id(kArbitraryFrameSinkId1, id2);
+  SurfaceId primary_surface_id(kArbitraryFrameSinkId1, id4);
+  Quad embedded_quads[] = {Quad::SolidColorQuad(SK_ColorGREEN, gfx::Rect(5, 5)),
+                           Quad::SolidColorQuad(SK_ColorBLUE, gfx::Rect(5, 5))};
+  Pass embedded_passes[] = {
+      Pass(embedded_quads, base::size(embedded_quads), SurfaceSize())};
+
+  constexpr float device_scale_factor = 1.0f;
+  SubmitCompositorFrame(embedded_support.get(), embedded_passes,
+                        base::size(embedded_passes), id2, device_scale_factor);
+  Quad quads[] = {Quad::SurfaceQuad(primary_surface_id, fallback_surface_id,
+                                    SK_ColorWHITE, gfx::Rect(5, 5), 1.f,
+                                    gfx::Transform(), false)};
+  Pass passes[] = {Pass(quads, base::size(quads), SurfaceSize())};
+
+  SubmitCompositorFrame(support_.get(), passes, base::size(passes),
+                        root_local_surface_id_, device_scale_factor);
+
+  SurfaceId root_surface_id(support_->frame_sink_id(), root_local_surface_id_);
+  CompositorFrame aggregated_frame =
+      aggregator_.Aggregate(root_surface_id, GetNextDisplayTimeAndIncrement());
+
+  // |id1| is before the fallback id so it shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id1)));
+
+  // |id2| is the fallback id so it should damage the display.
+  EXPECT_TRUE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id2)));
+
+  // |id3| is between fallback and primary so it should damage the display.
+  EXPECT_TRUE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id3)));
+
+  // |id4| is the primary id so it should damage the display.
+  EXPECT_TRUE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id4)));
+
+  // |id5| is newer than the primary surface so it shouldn't damage display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id5)));
+
+  // This FrameSinkId is not embedded at all so it shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId3, id3)));
+}
+
+// Verifies that only damage to primary and fallback surfaces and nothing in
+// between damages the display if primary and fallback have different
+// FrameSinkIds.
+TEST_F(SurfaceAggregatorValidSurfaceTest, SurfaceDamageDifferentFrameSinkId) {
+  auto embedded_support = std::make_unique<CompositorFrameSinkSupport>(
+      nullptr, &manager_, kArbitraryFrameSinkId1, kRootIsRoot,
+      kNeedsSyncPoints);
+  LocalSurfaceId id1 = allocator_.GenerateId();
+  LocalSurfaceId id2 = allocator_.GenerateId();
+  LocalSurfaceId id3 = allocator_.GenerateId();
+  LocalSurfaceId id4 = allocator_.GenerateId();
+  LocalSurfaceId id5 = allocator_.GenerateId();
+  SurfaceId fallback_surface_id(kArbitraryFrameSinkId1, id2);
+  SurfaceId primary_surface_id(kArbitraryFrameSinkId2, id4);
+  Quad embedded_quads[] = {Quad::SolidColorQuad(SK_ColorGREEN, gfx::Rect(5, 5)),
+                           Quad::SolidColorQuad(SK_ColorBLUE, gfx::Rect(5, 5))};
+  Pass embedded_passes[] = {
+      Pass(embedded_quads, base::size(embedded_quads), SurfaceSize())};
+
+  constexpr float device_scale_factor = 1.0f;
+  SubmitCompositorFrame(embedded_support.get(), embedded_passes,
+                        base::size(embedded_passes), id2, device_scale_factor);
+  Quad quads[] = {Quad::SurfaceQuad(primary_surface_id, fallback_surface_id,
+                                    SK_ColorWHITE, gfx::Rect(5, 5), 1.f,
+                                    gfx::Transform(), false)};
+  Pass passes[] = {Pass(quads, base::size(quads), SurfaceSize())};
+
+  SubmitCompositorFrame(support_.get(), passes, base::size(passes),
+                        root_local_surface_id_, device_scale_factor);
+
+  SurfaceId root_surface_id(support_->frame_sink_id(), root_local_surface_id_);
+  CompositorFrame aggregated_frame =
+      aggregator_.Aggregate(root_surface_id, GetNextDisplayTimeAndIncrement());
+
+  // |id1| is before the fallback id so it shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id1)));
+
+  // |id2| is the fallback id so it should damage the display.
+  EXPECT_TRUE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id2)));
+
+  // |id3| is after the fallback but primary has a different FrameSinkId so it
+  // shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id3)));
+
+  // |id3| is before the primary but fallback has a different FrameSinkId so it
+  // shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId2, id3)));
+
+  // |id4| is the primary id so it should damage the display.
+  EXPECT_TRUE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId2, id4)));
+
+  // |id5| is newer than the primary surface so it shouldn't damage display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id5)));
+
+  // This FrameSinkId is not embedded at all so it shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId3, id4)));
+}
+
+// Verifies that when only a primary surface is provided any damage to primary
+// surface damages the display.
+TEST_F(SurfaceAggregatorValidSurfaceTest, SurfaceDamagePrimarySurfaceOnly) {
+  LocalSurfaceId id1 = allocator_.GenerateId();
+  LocalSurfaceId id2 = allocator_.GenerateId();
+  LocalSurfaceId id3 = allocator_.GenerateId();
+  SurfaceId primary_surface_id(kArbitraryFrameSinkId1, id2);
+  Quad quads[] = {Quad::SurfaceQuad(primary_surface_id, InvalidSurfaceId(),
+                                    SK_ColorWHITE, gfx::Rect(5, 5), 1.f,
+                                    gfx::Transform(), false)};
+  Pass passes[] = {Pass(quads, base::size(quads), SurfaceSize())};
+
+  constexpr float device_scale_factor = 1.0f;
+  SubmitCompositorFrame(support_.get(), passes, base::size(passes),
+                        root_local_surface_id_, device_scale_factor);
+
+  SurfaceId root_surface_id(support_->frame_sink_id(), root_local_surface_id_);
+  CompositorFrame aggregated_frame =
+      aggregator_.Aggregate(root_surface_id, GetNextDisplayTimeAndIncrement());
+
+  // |id1| is before the primary id but there is no fallback so it shouldn't
+  // damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id1)));
+
+  // |id2| is the primary id so it should damage the display.
+  EXPECT_TRUE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id2)));
+
+  // |id3| is after the primary id so it shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id3)));
+
+  // This FrameSinkId is not embedded at all so it shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId3, id2)));
+}
+
+// Verifies that when primary and fallback ids are equal, only damage to that
+// particular surface causee damage to display.
+TEST_F(SurfaceAggregatorValidSurfaceTest,
+       SurfaceDamagePrimaryAndFallbackEqual) {
+  auto embedded_support = std::make_unique<CompositorFrameSinkSupport>(
+      nullptr, &manager_, kArbitraryFrameSinkId1, kRootIsRoot,
+      kNeedsSyncPoints);
+  LocalSurfaceId id1 = allocator_.GenerateId();
+  LocalSurfaceId id2 = allocator_.GenerateId();
+  LocalSurfaceId id3 = allocator_.GenerateId();
+  SurfaceId surface_id(kArbitraryFrameSinkId1, id2);
+
+  Quad embedded_quads[] = {Quad::SolidColorQuad(SK_ColorGREEN, gfx::Rect(5, 5)),
+                           Quad::SolidColorQuad(SK_ColorBLUE, gfx::Rect(5, 5))};
+  Pass embedded_passes[] = {
+      Pass(embedded_quads, base::size(embedded_quads), SurfaceSize())};
+  constexpr float device_scale_factor = 1.0f;
+  SubmitCompositorFrame(embedded_support.get(), embedded_passes,
+                        base::size(embedded_passes), id2, device_scale_factor);
+
+  Quad quads[] = {Quad::SurfaceQuad(surface_id, surface_id, SK_ColorWHITE,
+                                    gfx::Rect(5, 5), 1.f, gfx::Transform(),
+                                    false)};
+  Pass passes[] = {Pass(quads, base::size(quads), SurfaceSize())};
+  SubmitCompositorFrame(support_.get(), passes, base::size(passes),
+                        root_local_surface_id_, device_scale_factor);
+
+  SurfaceId root_surface_id(support_->frame_sink_id(), root_local_surface_id_);
+  CompositorFrame aggregated_frame =
+      aggregator_.Aggregate(root_surface_id, GetNextDisplayTimeAndIncrement());
+
+  // |id1| is before the fallback id so it shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id1)));
+
+  // |id2| is the embedded id so it should damage the display.
+  EXPECT_TRUE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id2)));
+
+  // |id3| is newer than primary id so it shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId1, id3)));
+
+  // This FrameSinkId is not embedded at all so it shouldn't damage the display.
+  EXPECT_FALSE(aggregator_.NotifySurfaceDamageAndCheckForDisplayDamage(
+      SurfaceId(kArbitraryFrameSinkId3, id2)));
+}
+
 class SurfaceAggregatorPartialSwapTest
     : public SurfaceAggregatorValidSurfaceTest {
  public:
diff --git a/components/viz/service/main/viz_main_impl.cc b/components/viz/service/main/viz_main_impl.cc
index c0dd561..c08e4619 100644
--- a/components/viz/service/main/viz_main_impl.cc
+++ b/components/viz/service/main/viz_main_impl.cc
@@ -195,7 +195,7 @@
                                   base::Unretained(this)));
     compositor_thread_->Stop();
     compositor_thread_.reset();
-    compositor_thread_task_runner_ = nullptr;
+    compositor_thread_task_runner_.reset();
   }
 
   if (ukm_recorder_)
diff --git a/components/viz/service/surfaces/surface.cc b/components/viz/service/surfaces/surface.cc
index a17dadc..dada288 100644
--- a/components/viz/service/surfaces/surface.cc
+++ b/components/viz/service/surfaces/surface.cc
@@ -30,13 +30,9 @@
       surface_manager_(surface_manager),
       surface_client_(std::move(surface_client)),
       needs_sync_tokens_(needs_sync_tokens) {
-  TRACE_EVENT_WITH_FLOW2(
-      TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
-      "LocalSurfaceId.Submission.Flow",
-      TRACE_ID_GLOBAL(
-          surface_info.id().local_surface_id().submission_trace_id()),
-      TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "step",
-      "SurfaceCreated", "surface_id", surface_info.id().ToString());
+  TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("viz.surface_lifetime"),
+                           "Surface", this, "surface_info",
+                           surface_info.ToString());
 }
 
 Surface::~Surface() {
@@ -51,6 +47,10 @@
 
   if (deadline_)
     deadline_->Cancel();
+
+  TRACE_EVENT_ASYNC_END1(TRACE_DISABLED_BY_DEFAULT("viz.surface_lifetime"),
+                         "Surface", this, "surface_info",
+                         surface_info_.ToString());
 }
 
 void Surface::SetDependencyDeadline(
@@ -576,6 +576,16 @@
 }
 
 void Surface::OnWillBeDrawn() {
+  if (!seen_first_surface_embedding_) {
+    seen_first_surface_embedding_ = true;
+
+    TRACE_EVENT_WITH_FLOW2(
+        TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
+        "LocalSurfaceId.Embed.Flow",
+        TRACE_ID_GLOBAL(surface_info_.id().local_surface_id().embed_trace_id()),
+        TRACE_EVENT_FLAG_FLOW_IN, "step", "FirstSurfaceEmbedding", "surface_id",
+        surface_info_.id().ToString());
+  }
   surface_manager_->SurfaceWillBeDrawn(this);
 }
 
diff --git a/components/viz/service/surfaces/surface.h b/components/viz/service/surfaces/surface.h
index 92e13e7d..a6801297 100644
--- a/components/viz/service/surfaces/surface.h
+++ b/components/viz/service/surfaces/surface.h
@@ -286,6 +286,7 @@
   base::Optional<FrameData> active_frame_data_;
   bool closed_ = false;
   bool seen_first_frame_activation_ = false;
+  bool seen_first_surface_embedding_ = false;
   const bool needs_sync_tokens_;
 
   base::flat_set<SurfaceId> activation_dependencies_;
diff --git a/components/viz/service/surfaces/surface_manager.cc b/components/viz/service/surfaces/surface_manager.cc
index a1c258a..ff9617a4 100644
--- a/components/viz/service/surfaces/surface_manager.cc
+++ b/components/viz/service/surfaces/surface_manager.cc
@@ -317,13 +317,6 @@
     return;
   }
 
-  TRACE_EVENT_WITH_FLOW2(
-      TRACE_DISABLED_BY_DEFAULT("viz.surface_id_flow"),
-      "LocalSurfaceId.Embed.Flow",
-      TRACE_ID_GLOBAL(child_id.local_surface_id().embed_trace_id()),
-      TRACE_EVENT_FLAG_FLOW_IN, "step", "NewReference", "reference",
-      reference.ToString());
-
   references_[parent_id].children.insert(child_id);
   references_[child_id].parents.insert(parent_id);
 
diff --git a/components/viz/test/DEPS b/components/viz/test/DEPS
index d44db738..c5faf37 100644
--- a/components/viz/test/DEPS
+++ b/components/viz/test/DEPS
@@ -34,6 +34,6 @@
   ],
 
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder/embedder.h",
+    "+mojo/core/embedder/embedder.h",
   ],
 }
diff --git a/components/viz/test/run_all_unittests.cc b/components/viz/test/run_all_unittests.cc
index de93e66..78d4353 100644
--- a/components/viz/test/run_all_unittests.cc
+++ b/components/viz/test/run_all_unittests.cc
@@ -5,12 +5,12 @@
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "components/viz/test/viz_test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   viz::VizTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(
       argc, argv,
diff --git a/components/webcrypto/BUILD.gn b/components/webcrypto/BUILD.gn
index caecce67..1c092f13 100644
--- a/components/webcrypto/BUILD.gn
+++ b/components/webcrypto/BUILD.gn
@@ -109,7 +109,7 @@
     "//base",
     "//crypto",
     "//crypto:platform",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//third_party/blink/public:blink",
   ]
 }
diff --git a/components/webcrypto/DEPS b/components/webcrypto/DEPS
index f256c178..0f1fc2b 100644
--- a/components/webcrypto/DEPS
+++ b/components/webcrypto/DEPS
@@ -1,6 +1,6 @@
 include_rules = [
   "+crypto",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+third_party/boringssl/src/include",
   "+third_party/re2",
   "+third_party/blink/public/platform",
diff --git a/components/webcrypto/fuzzer_support.cc b/components/webcrypto/fuzzer_support.cc
index 107d742..a68a4ca 100644
--- a/components/webcrypto/fuzzer_support.cc
+++ b/components/webcrypto/fuzzer_support.cc
@@ -11,7 +11,7 @@
 #include "components/webcrypto/algorithm_dispatch.h"
 #include "components/webcrypto/crypto_data.h"
 #include "components/webcrypto/status.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_crypto_algorithm_params.h"
 #include "third_party/blink/public/web/blink.h"
@@ -25,7 +25,7 @@
  public:
   InitOnce() {
     base::CommandLine::Init(0, nullptr);
-    mojo::edk::Init();
+    mojo::core::Init();
     blink::Platform::Initialize(this);
   }
   ~InitOnce() override {}
diff --git a/components/webdata_services/web_data_service_wrapper.cc b/components/webdata_services/web_data_service_wrapper.cc
index 2c103d86f..bc66797 100644
--- a/components/webdata_services/web_data_service_wrapper.cc
+++ b/components/webdata_services/web_data_service_wrapper.cc
@@ -14,6 +14,7 @@
 #include "base/task_scheduler/post_task.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/webdata/autocomplete_sync_bridge.h"
+#include "components/autofill/core/browser/webdata/autofill_profile_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h"
 #include "components/autofill/core/browser/webdata/autofill_table.h"
 #include "components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h"
@@ -40,6 +41,9 @@
 
 namespace {
 
+// TODO(jkrcal): Rename this function when the last webdata sync type get
+// converted to USS, e.g. to InitSyncBridgesOnDBSequence(). Check also other
+// related functions.
 void InitSyncableServicesOnDBSequence(
     scoped_refptr<base::SingleThreadTaskRunner> db_task_runner,
     const syncer::SyncableService::StartSyncFlare& sync_flare,
@@ -54,17 +58,22 @@
   autofill::AutocompleteSyncBridge::CreateForWebDataServiceAndBackend(
       autofill_web_data.get(), autofill_backend);
 
-  autofill::AutofillProfileSyncableService::CreateForWebDataServiceAndBackend(
-      autofill_web_data.get(), autofill_backend, app_locale);
+  if (base::FeatureList::IsEnabled(switches::kSyncUSSAutofillProfile)) {
+    autofill::AutofillProfileSyncBridge::CreateForWebDataServiceAndBackend(
+        app_locale, autofill_backend, autofill_web_data.get());
+  } else {
+    autofill::AutofillProfileSyncableService::CreateForWebDataServiceAndBackend(
+        autofill_web_data.get(), autofill_backend, app_locale);
+    autofill::AutofillProfileSyncableService::FromWebDataService(
+        autofill_web_data.get())
+        ->InjectStartSyncFlare(sync_flare);
+  }
+
   autofill::AutofillWalletSyncableService::CreateForWebDataServiceAndBackend(
       autofill_web_data.get(), autofill_backend, app_locale);
   autofill::AutofillWalletMetadataSyncableService::
       CreateForWebDataServiceAndBackend(autofill_web_data.get(),
                                         autofill_backend, app_locale);
-
-  autofill::AutofillProfileSyncableService::FromWebDataService(
-      autofill_web_data.get())
-      ->InjectStartSyncFlare(sync_flare);
   autofill::AutofillWalletSyncableService::FromWebDataService(
       autofill_web_data.get())
       ->InjectStartSyncFlare(sync_flare);
diff --git a/components/zucchini/disassembler_dex.cc b/components/zucchini/disassembler_dex.cc
index 01d5e98..8a1b339 100644
--- a/components/zucchini/disassembler_dex.cc
+++ b/components/zucchini/disassembler_dex.cc
@@ -1446,12 +1446,17 @@
 std::unique_ptr<ReferenceWriter> DisassemblerDex::MakeWriteRelCode8(
     MutableBufferView image) {
   auto writer = base::BindRepeating([](Reference ref, MutableBufferView image) {
-    ptrdiff_t byte_diff = static_cast<ptrdiff_t>(ref.target) - ref.location;
-    DCHECK_EQ(0, byte_diff % kInstrUnitSize);
+    ptrdiff_t unsafe_byte_diff =
+        static_cast<ptrdiff_t>(ref.target) - ref.location;
+    DCHECK_EQ(0, unsafe_byte_diff % kInstrUnitSize);
     // |delta| is relative to start of instruction, which is 1 unit before
     // |ref.location|. The subtraction above removed too much, so +1 to fix.
-    ptrdiff_t delta = (byte_diff / kInstrUnitSize) + 1;
-    image.write<int8_t>(ref.location, base::checked_cast<int8_t>(delta));
+    base::CheckedNumeric<int8_t> delta((unsafe_byte_diff / kInstrUnitSize) + 1);
+    if (!delta.IsValid()) {
+      LOG(ERROR) << "Invalid reference at: " << AsHex<8>(ref.location);
+      return;
+    }
+    image.write<int8_t>(ref.location, delta.ValueOrDie());
   });
   return std::make_unique<ReferenceWriterAdaptor>(image, std::move(writer));
 }
@@ -1459,12 +1464,18 @@
 std::unique_ptr<ReferenceWriter> DisassemblerDex::MakeWriteRelCode16(
     MutableBufferView image) {
   auto writer = base::BindRepeating([](Reference ref, MutableBufferView image) {
-    ptrdiff_t byte_diff = static_cast<ptrdiff_t>(ref.target) - ref.location;
-    DCHECK_EQ(0, byte_diff % kInstrUnitSize);
+    ptrdiff_t unsafe_byte_diff =
+        static_cast<ptrdiff_t>(ref.target) - ref.location;
+    DCHECK_EQ(0, unsafe_byte_diff % kInstrUnitSize);
     // |delta| is relative to start of instruction, which is 1 unit before
     // |ref.location|. The subtraction above removed too much, so +1 to fix.
-    ptrdiff_t delta = (byte_diff / kInstrUnitSize) + 1;
-    image.write<int16_t>(ref.location, base::checked_cast<int16_t>(delta));
+    base::CheckedNumeric<int16_t> delta((unsafe_byte_diff / kInstrUnitSize) +
+                                        1);
+    if (!delta.IsValid()) {
+      LOG(ERROR) << "Invalid reference at: " << AsHex<8>(ref.location);
+      return;
+    }
+    image.write<int16_t>(ref.location, delta.ValueOrDie());
   });
   return std::make_unique<ReferenceWriterAdaptor>(image, std::move(writer));
 }
@@ -1472,10 +1483,18 @@
 std::unique_ptr<ReferenceWriter> DisassemblerDex::MakeWriteRelCode32(
     MutableBufferView image) {
   auto writer = base::BindRepeating([](Reference ref, MutableBufferView image) {
-    ptrdiff_t byte_diff = static_cast<ptrdiff_t>(ref.target) - ref.location;
-    DCHECK_EQ(0, byte_diff % kInstrUnitSize);
-    ptrdiff_t delta = (byte_diff / kInstrUnitSize) + 1;
-    image.write<int32_t>(ref.location, base::checked_cast<int32_t>(delta));
+    ptrdiff_t unsafe_byte_diff =
+        static_cast<ptrdiff_t>(ref.target) - ref.location;
+    DCHECK_EQ(0, unsafe_byte_diff % kInstrUnitSize);
+    // |delta| is relative to start of instruction, which is 1 unit before
+    // |ref.location|. The subtraction above removed too much, so +1 to fix.
+    base::CheckedNumeric<int32_t> delta((unsafe_byte_diff / kInstrUnitSize) +
+                                        1);
+    if (!delta.IsValid()) {
+      LOG(ERROR) << "Invalid reference at: " << AsHex<8>(ref.location);
+      return;
+    }
+    image.write<int32_t>(ref.location, delta.ValueOrDie());
   });
   return std::make_unique<ReferenceWriterAdaptor>(image, std::move(writer));
 }
diff --git a/content/DEPS b/content/DEPS
index b35c12a..8973f765 100644
--- a/content/DEPS
+++ b/content/DEPS
@@ -33,9 +33,7 @@
   "+dbus",
   "+gpu",
   "+media",
-  "+mojo/edk/embedder",
-  "+mojo/edk/js",
-  "+mojo/message_pump",
+  "+mojo/core/embedder",
   "+mojo/public",
   "+net",
   "+ppapi",
diff --git a/content/app/BUILD.gn b/content/app/BUILD.gn
index e24801e..7ce38b1 100644
--- a/content/app/BUILD.gn
+++ b/content/app/BUILD.gn
@@ -32,7 +32,7 @@
     "//services/service_manager/embedder",
     "//services/service_manager/public/mojom",
     "//services/service_manager/runner/common",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//ppapi/buildflags",
     "//ui/base",
     "//ui/gfx",
diff --git a/content/app/content_service_manager_main_delegate.cc b/content/app/content_service_manager_main_delegate.cc
index f3132ac7..92b9c5bc 100644
--- a/content/app/content_service_manager_main_delegate.cc
+++ b/content/app/content_service_manager_main_delegate.cc
@@ -65,7 +65,7 @@
 }
 
 void ContentServiceManagerMainDelegate::OverrideMojoConfiguration(
-    mojo::edk::Configuration* config) {
+    mojo::core::Configuration* config) {
   // If this is the browser process and there's no remote service manager, we
   // will serve as the global Mojo broker.
   if (!service_manager::ServiceManagerIsRemote() &&
diff --git a/content/app/content_service_manager_main_delegate.h b/content/app/content_service_manager_main_delegate.h
index a6ab54a..283e1da 100644
--- a/content/app/content_service_manager_main_delegate.h
+++ b/content/app/content_service_manager_main_delegate.h
@@ -33,7 +33,7 @@
   int RunEmbedderProcess() override;
   void ShutDownEmbedderProcess() override;
   service_manager::ProcessType OverrideProcessType() override;
-  void OverrideMojoConfiguration(mojo::edk::Configuration* config) override;
+  void OverrideMojoConfiguration(mojo::core::Configuration* config) override;
   std::unique_ptr<base::Value> CreateServiceCatalog() override;
   bool ShouldLaunchAsServiceProcess(
       const service_manager::Identity& identity) override;
diff --git a/content/app/mojo/mojo_init.cc b/content/app/mojo/mojo_init.cc
index c32f688..6b9b377 100644
--- a/content/app/mojo/mojo_init.cc
+++ b/content/app/mojo/mojo_init.cc
@@ -10,8 +10,8 @@
 #include "base/lazy_instance.h"
 #include "content/public/common/content_switches.h"
 #include "ipc/ipc_channel.h"
-#include "mojo/edk/embedder/configuration.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/configuration.h"
+#include "mojo/core/embedder/embedder.h"
 
 namespace content {
 
@@ -20,9 +20,9 @@
 class MojoInitializer {
  public:
   MojoInitializer() {
-    mojo::edk::Configuration config;
+    mojo::core::Configuration config;
     config.max_message_num_bytes = IPC::Channel::kMaximumMessageSize;
-    mojo::edk::Init(config);
+    mojo::core::Init(config);
   }
 };
 
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 7eb6668..7c204dd 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -109,7 +109,7 @@
     "//media/mojo/interfaces",
     "//media/mojo/interfaces:constants",
     "//media/mojo/services",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/platform",
     "//mojo/public/cpp/system",
diff --git a/content/browser/background_fetch/background_fetch_service_unittest.cc b/content/browser/background_fetch/background_fetch_service_unittest.cc
index 5fc825a..05b56d63 100644
--- a/content/browser/background_fetch/background_fetch_service_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_service_unittest.cc
@@ -21,7 +21,7 @@
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/common/service_worker/service_worker_types.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/message.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
@@ -49,13 +49,13 @@
  public:
   BadMessageObserver()
       : dummy_message_(0, 0, 0, 0, nullptr), context_(&dummy_message_) {
-    mojo::edk::SetDefaultProcessErrorCallback(base::BindRepeating(
+    mojo::core::SetDefaultProcessErrorCallback(base::BindRepeating(
         &BadMessageObserver::ReportBadMessage, base::Unretained(this)));
   }
 
   ~BadMessageObserver() {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   const std::string& last_error() const { return last_error_; }
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index cdba605..95f4936 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -118,8 +118,8 @@
 #include "media/media_buildflags.h"
 #include "media/midi/midi_service.h"
 #include "media/mojo/buildflags.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/bindings/sync_call_restrictions.h"
 #include "net/base/network_change_notifier.h"
 #include "net/socket/client_socket_factory.h"
@@ -1570,15 +1570,15 @@
     mojo::SyncCallRestrictions::DisallowSyncCall();
   }
 
-  mojo_ipc_support_.reset(new mojo::edk::ScopedIPCSupport(
+  mojo_ipc_support_.reset(new mojo::core::ScopedIPCSupport(
       BrowserThread::GetTaskRunnerForThread(BrowserThread::IO),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST));
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST));
 
   service_manager_context_.reset(
       new ServiceManagerContext(io_thread_->task_runner()));
   ServiceManagerContext::StartBrowserConnection();
 #if defined(OS_MACOSX)
-  mojo::edk::SetMachPortProvider(MachBroker::GetInstance());
+  mojo::core::SetMachPortProvider(MachBroker::GetInstance());
 #endif  // defined(OS_MACOSX)
   GetContentClient()->OnServiceManagerConnected(
       ServiceManagerConnection::GetForProcess());
diff --git a/content/browser/browser_main_loop.h b/content/browser/browser_main_loop.h
index 8f0e4e8d..b48feb1 100644
--- a/content/browser/browser_main_loop.h
+++ b/content/browser/browser_main_loop.h
@@ -71,9 +71,9 @@
 }  // namespace midi
 
 namespace mojo {
-namespace edk {
+namespace core {
 class ScopedIPCSupport;
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
 namespace net {
@@ -338,7 +338,7 @@
 
   // Members initialized in |BrowserThreadsStarted()| --------------------------
   std::unique_ptr<ServiceManagerContext> service_manager_context_;
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> mojo_ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> mojo_ipc_support_;
 
   // |user_input_monitor_| has to outlive |audio_manager_|, so declared first.
   std::unique_ptr<media::UserInputMonitor> user_input_monitor_;
diff --git a/content/browser/child_process_launcher_helper_posix.h b/content/browser/child_process_launcher_helper_posix.h
index 69dbe0e..956c6d3a 100644
--- a/content/browser/child_process_launcher_helper_posix.h
+++ b/content/browser/child_process_launcher_helper_posix.h
@@ -18,7 +18,7 @@
 
 namespace mojo {
 class PlatformChannelEndpoint;
-}  // namespace edk
+}  // namespace mojo
 
 // Contains the common functionalities between the various POSIX child process
 // launcher implementations.
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
index 0d20ef8..aa29868 100644
--- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -2605,9 +2605,15 @@
   ASSERT_EQ(download::DownloadItem::COMPLETE, download->GetState());
 }
 
+// Flakly on ChromeOS https://crbug.com/860312
+#if defined(OS_CHROMEOS)
+#define MAYBE_MultiDownload DISABLED_MultiDownload
+#else
+#define MAYBE_MultiDownload MultiDownload
+#endif
 // Check that downloading multiple (in this case, 2) files does not result in
 // corrupted files.
-IN_PROC_BROWSER_TEST_F(DevToolsDownloadContentTest, MultiDownload) {
+IN_PROC_BROWSER_TEST_F(DevToolsDownloadContentTest, MAYBE_MultiDownload) {
   base::ThreadRestrictions::SetIOAllowed(true);
   SetupEnsureNoPendingDownloads();
   NavigateToURLBlockUntilNavigationsComplete(shell(), GURL("about:blank"), 1);
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index db70cad..f131c03 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -428,6 +428,11 @@
 
 bool RenderFrameDevToolsAgentHost::AttachSession(DevToolsSession* session,
                                                  TargetRegistry* registry) {
+  DevToolsManager* manager = DevToolsManager::GetInstance();
+  if (manager->delegate() && web_contents()) {
+    if (!manager->delegate()->AllowInspectingWebContents(web_contents()))
+      return false;
+  }
   const bool is_webui =
       frame_host_ && (frame_host_->web_ui() || frame_host_->pending_web_ui());
   if (!session->client()->MayAttachToRenderer(frame_host_, is_webui))
diff --git a/content/browser/dom_storage/session_storage_context_mojo_unittest.cc b/content/browser/dom_storage/session_storage_context_mojo_unittest.cc
index 8d80d45..b904fd3 100644
--- a/content/browser/dom_storage/session_storage_context_mojo_unittest.cc
+++ b/content/browser/dom_storage/session_storage_context_mojo_unittest.cc
@@ -26,7 +26,7 @@
 #include "content/public/browser/session_storage_usage_info.h"
 #include "content/public/common/content_features.h"
 #include "content/public/test/test_utils.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
 #include "services/file/file_service.h"
 #include "services/file/public/mojom/constants.mojom.h"
@@ -63,13 +63,13 @@
 
   void SetUp() override {
     features_.InitAndEnableFeature(features::kMojoSessionStorage);
-    mojo::edk::SetDefaultProcessErrorCallback(base::BindRepeating(
+    mojo::core::SetDefaultProcessErrorCallback(base::BindRepeating(
         &SessionStorageContextMojoTest::OnBadMessage, base::Unretained(this)));
   }
 
   void TearDown() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   void OnBadMessage(const std::string& reason) { bad_message_called_ = true; }
diff --git a/content/browser/dom_storage/session_storage_namespace_impl_mojo_unittest.cc b/content/browser/dom_storage/session_storage_namespace_impl_mojo_unittest.cc
index 922e3dc1..de79bd92 100644
--- a/content/browser/dom_storage/session_storage_namespace_impl_mojo_unittest.cc
+++ b/content/browser/dom_storage/session_storage_namespace_impl_mojo_unittest.cc
@@ -15,7 +15,7 @@
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/test/fake_leveldb_database.h"
 #include "content/test/gmock_util.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/strong_associated_binding.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -78,7 +78,7 @@
     security_policy->LockToOrigin(kTestProcessIdOrigin3,
                                   test_origin3_.GetURL());
 
-    mojo::edk::SetDefaultProcessErrorCallback(
+    mojo::core::SetDefaultProcessErrorCallback(
         base::BindRepeating(&SessionStorageNamespaceImplMojoTest::OnBadMessage,
                             base::Unretained(this)));
   }
@@ -91,8 +91,8 @@
     security_policy->Remove(kTestProcessIdAllOrigins);
     security_policy->Remove(kTestProcessIdOrigin3);
 
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   // Creates a SessionStorageNamespaceImplMojo, saves it in the namespaces_ map,
diff --git a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
index 4ff6334..4729a7b 100644
--- a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
+++ b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
@@ -121,7 +121,7 @@
 }
 
 void PictureInPictureWindowControllerImpl::UpdateLayerBounds() {
-  if (window_) {
+  if (window_ && window_->IsVisible()) {
     media_web_contents_observer_->OnPictureInPictureWindowResize(
         window_->GetBounds().size());
   }
diff --git a/content/browser/renderer_host/media/audio_output_authorization_handler.cc b/content/browser/renderer_host/media/audio_output_authorization_handler.cc
index 1b601ac..239c8be 100644
--- a/content/browser/renderer_host/media/audio_output_authorization_handler.cc
+++ b/content/browser/renderer_host/media/audio_output_authorization_handler.cc
@@ -253,10 +253,10 @@
   devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = true;
   media_stream_manager_->media_devices_manager()->EnumerateDevices(
       devices_to_enumerate,
-      base::Bind(&AudioOutputAuthorizationHandler::TranslateDeviceID,
-                 weak_factory_.GetWeakPtr(), base::Passed(&trace_scope),
-                 base::Passed(&cb), device_id, std::move(salt),
-                 std::move(security_origin)));
+      base::BindOnce(&AudioOutputAuthorizationHandler::TranslateDeviceID,
+                     weak_factory_.GetWeakPtr(), base::Passed(&trace_scope),
+                     base::Passed(&cb), device_id, std::move(salt),
+                     std::move(security_origin)));
 }
 
 void AudioOutputAuthorizationHandler::TranslateDeviceID(
diff --git a/content/browser/renderer_host/media/media_devices_dispatcher_host.cc b/content/browser/renderer_host/media/media_devices_dispatcher_host.cc
index 673bba7..c87ff86 100644
--- a/content/browser/renderer_host/media/media_devices_dispatcher_host.cc
+++ b/content/browser/renderer_host/media/media_devices_dispatcher_host.cc
@@ -205,9 +205,10 @@
   requested_types[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = true;
   media_stream_manager_->media_devices_manager()->EnumerateDevices(
       requested_types,
-      base::Bind(&MediaDevicesDispatcherHost::FinalizeGetVideoInputCapabilities,
-                 weak_factory_.GetWeakPtr(), base::Passed(&client_callback),
-                 std::move(salt_and_origin), std::move(default_device_id)));
+      base::BindOnce(
+          &MediaDevicesDispatcherHost::FinalizeGetVideoInputCapabilities,
+          weak_factory_.GetWeakPtr(), base::Passed(&client_callback),
+          std::move(salt_and_origin), std::move(default_device_id)));
 }
 
 void MediaDevicesDispatcherHost::FinalizeGetVideoInputCapabilities(
@@ -325,8 +326,8 @@
   devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = true;
   media_stream_manager_->media_devices_manager()->EnumerateDevices(
       devices_to_enumerate,
-      base::Bind(&MediaDevicesDispatcherHost::GotAudioInputEnumeration,
-                 weak_factory_.GetWeakPtr(), default_device_id));
+      base::BindOnce(&MediaDevicesDispatcherHost::GotAudioInputEnumeration,
+                     weak_factory_.GetWeakPtr(), default_device_id));
 }
 
 void MediaDevicesDispatcherHost::GotAudioInputEnumeration(
diff --git a/content/browser/renderer_host/media/media_devices_manager.cc b/content/browser/renderer_host/media/media_devices_manager.cc
index 93c8f2b..57527465 100644
--- a/content/browser/renderer_host/media/media_devices_manager.cc
+++ b/content/browser/renderer_host/media/media_devices_manager.cc
@@ -194,8 +194,8 @@
 
 struct MediaDevicesManager::EnumerationRequest {
   EnumerationRequest(const BoolDeviceTypes& requested_types,
-                     const EnumerationCallback& callback)
-      : callback(callback) {
+                     EnumerationCallback callback)
+      : callback(std::move(callback)) {
     requested = requested_types;
     has_seen_result.fill(false);
   }
@@ -360,12 +360,14 @@
 MediaDevicesManager::MediaDevicesManager(
     media::AudioSystem* audio_system,
     const scoped_refptr<VideoCaptureManager>& video_capture_manager,
-    MediaStreamManager* media_stream_manager)
+    StopRemovedInputDeviceCallback stop_removed_input_device_cb,
+    UIInputDeviceChangeCallback ui_input_device_change_cb)
     : use_fake_devices_(base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kUseFakeDeviceForMediaStream)),
       audio_system_(audio_system),
       video_capture_manager_(video_capture_manager),
-      media_stream_manager_(media_stream_manager),
+      stop_removed_input_device_cb_(std::move(stop_removed_input_device_cb)),
+      ui_input_device_change_cb_(std::move(ui_input_device_change_cb)),
       permission_checker_(std::make_unique<MediaDevicesPermissionChecker>()),
       cache_infos_(NUM_MEDIA_DEVICE_TYPES),
       monitoring_started_(false),
@@ -375,6 +377,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(audio_system_);
   DCHECK(video_capture_manager_.get());
+  DCHECK(!stop_removed_input_device_cb_.is_null());
+  DCHECK(!ui_input_device_change_cb_.is_null());
   cache_policies_.fill(CachePolicy::NO_CACHE);
   has_seen_result_.fill(false);
 }
@@ -385,11 +389,11 @@
 
 void MediaDevicesManager::EnumerateDevices(
     const BoolDeviceTypes& requested_types,
-    const EnumerationCallback& callback) {
+    EnumerationCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   StartMonitoring();
 
-  requests_.emplace_back(requested_types, callback);
+  requests_.emplace_back(requested_types, std::move(callback));
   bool all_results_cached = true;
   for (size_t i = 0; i < NUM_MEDIA_DEVICE_TYPES; ++i) {
     if (requested_types[i] && cache_policies_[i] == CachePolicy::NO_CACHE) {
@@ -651,11 +655,10 @@
 
   EnumerateDevices(
       internal_requested_types,
-      base::BindRepeating(&MediaDevicesManager::OnDevicesEnumerated,
-                          weak_factory_.GetWeakPtr(), requested_types,
-                          request_video_input_capabilities,
-                          base::Passed(&callback), std::move(salt_and_origin),
-                          has_permissions));
+      base::BindOnce(&MediaDevicesManager::OnDevicesEnumerated,
+                     weak_factory_.GetWeakPtr(), requested_types,
+                     request_video_input_capabilities, base::Passed(&callback),
+                     std::move(salt_and_origin), has_permissions));
 }
 
 void MediaDevicesManager::OnDevicesEnumerated(
@@ -804,10 +807,9 @@
   bool need_update_device_change_subscribers = false;
   MediaDeviceInfoArray& old_snapshot = current_snapshot_[type];
 
-  if (old_snapshot.size() != new_snapshot.size() &&
-      (type == MEDIA_DEVICE_TYPE_AUDIO_INPUT ||
-       type == MEDIA_DEVICE_TYPE_VIDEO_INPUT)) {
-    StopRemovedDevices(type, new_snapshot);
+  if (type == MEDIA_DEVICE_TYPE_AUDIO_INPUT ||
+      type == MEDIA_DEVICE_TYPE_VIDEO_INPUT) {
+    MaybeStopRemovedInputDevices(type, new_snapshot);
   }
 
   // Update the cached snapshot and send notifications only if the device list
@@ -824,9 +826,8 @@
     bool is_video_with_good_group_ids =
         type == MEDIA_DEVICE_TYPE_VIDEO_INPUT &&
         (new_snapshot.size() == 0 || !new_snapshot[0].group_id.empty());
-    if (type == MEDIA_DEVICE_TYPE_AUDIO_INPUT || is_video_with_good_group_ids) {
-      NotifyMediaStreamManager(type, new_snapshot);
-    }
+    if (type == MEDIA_DEVICE_TYPE_AUDIO_INPUT || is_video_with_good_group_ids)
+      ui_input_device_change_cb_.Run(type, new_snapshot);
 
     // Do not notify device-change subscribers after the first enumeration
     // result, since it is not due to an actual device change.
@@ -858,15 +859,16 @@
                    false /* ignore_group_id */);
   }
 
-  requests_.erase(std::remove_if(requests_.begin(), requests_.end(),
-                                 [this](const EnumerationRequest& request) {
-                                   if (IsEnumerationRequestReady(request)) {
-                                     request.callback.Run(current_snapshot_);
-                                     return true;
-                                   }
-                                   return false;
-                                 }),
-                  requests_.end());
+  requests_.erase(
+      std::remove_if(requests_.begin(), requests_.end(),
+                     [this](EnumerationRequest& request) {
+                       if (IsEnumerationRequestReady(request)) {
+                         std::move(request.callback).Run(current_snapshot_);
+                         return true;
+                       }
+                       return false;
+                     }),
+      requests_.end());
 }
 
 bool MediaDevicesManager::IsEnumerationRequestReady(
@@ -899,16 +901,13 @@
   DoEnumerateDevices(type);
 }
 
-void MediaDevicesManager::StopRemovedDevices(
+void MediaDevicesManager::MaybeStopRemovedInputDevices(
     MediaDeviceType type,
     const MediaDeviceInfoArray& new_snapshot) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(type == MEDIA_DEVICE_TYPE_AUDIO_INPUT ||
          type == MEDIA_DEVICE_TYPE_VIDEO_INPUT);
 
-  if (!media_stream_manager_)
-    return;
-
   for (const auto& old_device_info : current_snapshot_[type]) {
     auto it = std::find_if(new_snapshot.begin(), new_snapshot.end(),
                            [&old_device_info](const MediaDeviceInfo& info) {
@@ -918,23 +917,10 @@
     // If a device was removed, notify the MediaStreamManager to stop all
     // streams using that device.
     if (it == new_snapshot.end())
-      media_stream_manager_->StopRemovedDevice(type, old_device_info);
+      stop_removed_input_device_cb_.Run(type, old_device_info);
   }
 }
 
-void MediaDevicesManager::NotifyMediaStreamManager(
-    MediaDeviceType type,
-    const MediaDeviceInfoArray& new_snapshot) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(type == MEDIA_DEVICE_TYPE_AUDIO_INPUT ||
-         type == MEDIA_DEVICE_TYPE_VIDEO_INPUT);
-
-  if (!media_stream_manager_)
-    return;
-
-  media_stream_manager_->NotifyDevicesChanged(type, new_snapshot);
-}
-
 void MediaDevicesManager::NotifyDeviceChangeSubscribers(
     MediaDeviceType type,
     const MediaDeviceInfoArray& snapshot) {
diff --git a/content/browser/renderer_host/media/media_devices_manager.h b/content/browser/renderer_host/media/media_devices_manager.h
index c0f7ae126..4381dddf 100644
--- a/content/browser/renderer_host/media/media_devices_manager.h
+++ b/content/browser/renderer_host/media/media_devices_manager.h
@@ -37,7 +37,6 @@
 namespace content {
 
 class MediaDevicesPermissionChecker;
-class MediaStreamManager;
 class VideoCaptureManager;
 
 // Use MediaDeviceType values to index on this type.
@@ -60,15 +59,22 @@
   };
 
   using EnumerationCallback =
-      base::Callback<void(const MediaDeviceEnumeration&)>;
+      base::OnceCallback<void(const MediaDeviceEnumeration&)>;
   using EnumerateDevicesCallback =
       base::OnceCallback<void(const std::vector<MediaDeviceInfoArray>&,
                               std::vector<VideoInputDeviceCapabilitiesPtr>)>;
+  using StopRemovedInputDeviceCallback =
+      base::RepeatingCallback<void(MediaDeviceType type,
+                                   const MediaDeviceInfo& media_device_info)>;
+  using UIInputDeviceChangeCallback =
+      base::RepeatingCallback<void(MediaDeviceType stream_type,
+                                   const MediaDeviceInfoArray& devices)>;
 
   MediaDevicesManager(
       media::AudioSystem* audio_system,
       const scoped_refptr<VideoCaptureManager>& video_capture_manager,
-      MediaStreamManager* media_stream_manager);
+      StopRemovedInputDeviceCallback stop_removed_input_device_cb,
+      UIInputDeviceChangeCallback ui_input_device_change_cb);
   ~MediaDevicesManager() override;
 
   // Performs a possibly cached device enumeration for the requested device
@@ -79,7 +85,7 @@
   // another call to EnumerateDevices, it must do so by posting a task to the
   // IO thread.
   void EnumerateDevices(const BoolDeviceTypes& requested_types,
-                        const EnumerationCallback& callback);
+                        EnumerationCallback callback);
 
   // Performs a possibly cached device enumeration for the requested device
   // types and reports the results to |callback|. The enumeration results are
@@ -223,10 +229,8 @@
 
   // Helpers to handle device-change notification.
   void HandleDevicesChanged(MediaDeviceType type);
-  void StopRemovedDevices(MediaDeviceType type,
-                          const MediaDeviceInfoArray& new_snapshot);
-  void NotifyMediaStreamManager(MediaDeviceType type,
-                                const MediaDeviceInfoArray& new_snapshot);
+  void MaybeStopRemovedInputDevices(MediaDeviceType type,
+                                    const MediaDeviceInfoArray& new_snapshot);
   void NotifyDeviceChangeSubscribers(MediaDeviceType type,
                                      const MediaDeviceInfoArray& snapshot);
   void CheckPermissionForDeviceChange(uint32_t subscription_id,
@@ -248,7 +252,8 @@
   bool use_fake_devices_;
   media::AudioSystem* const audio_system_;  // not owned
   scoped_refptr<VideoCaptureManager> video_capture_manager_;
-  MediaStreamManager* const media_stream_manager_;  // not owned
+  StopRemovedInputDeviceCallback stop_removed_input_device_cb_;
+  UIInputDeviceChangeCallback ui_input_device_change_cb_;
 
   std::unique_ptr<MediaDevicesPermissionChecker> permission_checker_;
 
diff --git a/content/browser/renderer_host/media/media_devices_manager_unittest.cc b/content/browser/renderer_host/media/media_devices_manager_unittest.cc
index 761b26e..1da08cc 100644
--- a/content/browser/renderer_host/media/media_devices_manager_unittest.cc
+++ b/content/browser/renderer_host/media/media_devices_manager_unittest.cc
@@ -149,6 +149,16 @@
   mojo::BindingSet<blink::mojom::MediaDevicesListener> bindings_;
 };
 
+class MockMediaDevicesManagerClient {
+ public:
+  MOCK_METHOD2(StopRemovedInputDevice,
+               void(MediaDeviceType type,
+                    const MediaDeviceInfo& media_device_info));
+  MOCK_METHOD2(InputDevicesChangedUI,
+               void(MediaDeviceType stream_type,
+                    const MediaDeviceInfoArray& devices));
+};
+
 void VerifyDeviceAndGroupID(const std::vector<MediaDeviceInfoArray>& array) {
   for (const auto& device_infos : array) {
     for (const auto& device_info : device_infos) {
@@ -198,7 +208,13 @@
     video_capture_manager_ = new VideoCaptureManager(
         std::move(video_capture_provider), kIgnoreLogMessageCB);
     media_devices_manager_.reset(new MediaDevicesManager(
-        audio_system_.get(), video_capture_manager_, nullptr));
+        audio_system_.get(), video_capture_manager_,
+        base::BindRepeating(
+            &MockMediaDevicesManagerClient::StopRemovedInputDevice,
+            base::Unretained(&media_devices_manager_client_)),
+        base::BindRepeating(
+            &MockMediaDevicesManagerClient::InputDevicesChangedUI,
+            base::Unretained(&media_devices_manager_client_))));
     media_devices_manager_->set_salt_and_origin_callback_for_testing(
         base::BindRepeating(&GetSaltAndOrigin));
   }
@@ -217,6 +233,8 @@
   MockVideoCaptureDeviceFactory* video_capture_device_factory_;
   std::unique_ptr<MockAudioManager> audio_manager_;
   std::unique_ptr<media::AudioSystem> audio_system_;
+  testing::StrictMock<MockMediaDevicesManagerClient>
+      media_devices_manager_client_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MediaDevicesManagerTest);
@@ -229,14 +247,15 @@
       .Times(0);
   EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(0);
   EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
   MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
   devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = true;
   for (int i = 0; i < kNumCalls; i++) {
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
   }
 }
@@ -247,14 +266,15 @@
       .Times(kNumCalls);
   EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(0);
   EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
   MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
   devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = true;
   for (int i = 0; i < kNumCalls; i++) {
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
   }
 }
@@ -272,8 +292,8 @@
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
   }
 }
@@ -284,6 +304,7 @@
   EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_))
       .Times(kNumCalls);
   EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
   MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
   devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_INPUT] = true;
   devices_to_enumerate[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = true;
@@ -291,8 +312,8 @@
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
   }
 }
@@ -303,6 +324,7 @@
       .Times(0);
   EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(1);
   EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
   EnableCache(MEDIA_DEVICE_TYPE_AUDIO_INPUT);
   EnableCache(MEDIA_DEVICE_TYPE_AUDIO_OUTPUT);
   MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
@@ -312,8 +334,8 @@
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
   }
 }
@@ -324,6 +346,7 @@
       .Times(1);
   EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(0);
   EXPECT_CALL(*this, MockCallback(_)).Times(kNumCalls);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
   EnableCache(MEDIA_DEVICE_TYPE_VIDEO_INPUT);
   MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
   devices_to_enumerate[MEDIA_DEVICE_TYPE_VIDEO_INPUT] = true;
@@ -331,22 +354,22 @@
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
   }
 }
 
 TEST_F(MediaDevicesManagerTest, EnumerateCacheAudioWithDeviceChanges) {
   MediaDeviceEnumeration enumeration;
-  EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(2);
+  EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(3);
   EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors())
       .Times(0);
-  EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(2);
+  EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(3);
   EXPECT_CALL(*this, MockCallback(_))
-      .Times(2 * kNumCalls)
+      .Times(3 * kNumCalls)
       .WillRepeatedly(SaveArg<0>(&enumeration));
-
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
   size_t num_audio_input_devices = 5;
   size_t num_audio_output_devices = 3;
   audio_manager_->SetNumAudioInputDevices(num_audio_input_devices);
@@ -360,8 +383,8 @@
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
     EXPECT_EQ(num_audio_input_devices,
               enumeration[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size());
@@ -369,19 +392,49 @@
               enumeration[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].size());
   }
 
-  // Simulate device change
+  // Simulate removal of devices.
+  size_t old_num_audio_input_devices = num_audio_input_devices;
   num_audio_input_devices = 3;
-  num_audio_output_devices = 4;
+  num_audio_output_devices = 2;
+  ASSERT_LT(num_audio_input_devices, old_num_audio_input_devices);
+  size_t num_removed_audio_input_devices =
+      old_num_audio_input_devices - num_audio_input_devices;
+  EXPECT_CALL(media_devices_manager_client_, StopRemovedInputDevice(_, _))
+      .Times(num_removed_audio_input_devices);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
+
   audio_manager_->SetNumAudioInputDevices(num_audio_input_devices);
   audio_manager_->SetNumAudioOutputDevices(num_audio_output_devices);
   media_devices_manager_->OnDevicesChanged(base::SystemMonitor::DEVTYPE_AUDIO);
-
   for (int i = 0; i < kNumCalls; i++) {
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
+    run_loop.Run();
+    EXPECT_EQ(num_audio_input_devices,
+              enumeration[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size());
+    EXPECT_EQ(num_audio_output_devices,
+              enumeration[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].size());
+  }
+
+  // Simulate addition of devices.
+  old_num_audio_input_devices = num_audio_input_devices;
+  num_audio_input_devices = 4;
+  num_audio_output_devices = 3;
+  ASSERT_GT(num_audio_input_devices, old_num_audio_input_devices);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
+
+  audio_manager_->SetNumAudioInputDevices(num_audio_input_devices);
+  audio_manager_->SetNumAudioOutputDevices(num_audio_output_devices);
+  media_devices_manager_->OnDevicesChanged(base::SystemMonitor::DEVTYPE_AUDIO);
+  for (int i = 0; i < kNumCalls; i++) {
+    base::RunLoop run_loop;
+    media_devices_manager_->EnumerateDevices(
+        devices_to_enumerate,
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
     EXPECT_EQ(num_audio_input_devices,
               enumeration[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size());
@@ -394,13 +447,14 @@
   MediaDeviceEnumeration enumeration;
   EXPECT_CALL(*audio_manager_, MockGetAudioOutputDeviceNames(_)).Times(0);
   EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors())
-      .Times(2);
+      .Times(3);
   EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(0);
   EXPECT_CALL(*this, MockCallback(_))
-      .Times(2 * kNumCalls)
+      .Times(3 * kNumCalls)
       .WillRepeatedly(SaveArg<0>(&enumeration));
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
 
-  // Simulate device change
+  // First enumeration.
   size_t num_video_input_devices = 5;
   video_capture_device_factory_->SetToDefaultDevicesConfig(
       num_video_input_devices);
@@ -411,15 +465,18 @@
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
     EXPECT_EQ(num_video_input_devices,
               enumeration[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size());
   }
 
-  // Simulate device change
+  // Simulate addition of devices.
+  size_t old_num_video_input_devices = num_video_input_devices;
   num_video_input_devices = 9;
+  ASSERT_GT(num_video_input_devices, old_num_video_input_devices);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
   video_capture_device_factory_->SetToDefaultDevicesConfig(
       num_video_input_devices);
   media_devices_manager_->OnDevicesChanged(
@@ -429,8 +486,33 @@
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
+    run_loop.Run();
+    EXPECT_EQ(num_video_input_devices,
+              enumeration[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size());
+  }
+
+  // Simulate removal of devices.
+  old_num_video_input_devices = num_video_input_devices;
+  num_video_input_devices = 7;
+  ASSERT_LT(num_video_input_devices, old_num_video_input_devices);
+  size_t num_removed_video_input_devices =
+      old_num_video_input_devices - num_video_input_devices;
+  EXPECT_CALL(media_devices_manager_client_, StopRemovedInputDevice(_, _))
+      .Times(num_removed_video_input_devices);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _));
+  video_capture_device_factory_->SetToDefaultDevicesConfig(
+      num_video_input_devices);
+  media_devices_manager_->OnDevicesChanged(
+      base::SystemMonitor::DEVTYPE_VIDEO_CAPTURE);
+
+  for (int i = 0; i < kNumCalls; i++) {
+    base::RunLoop run_loop;
+    media_devices_manager_->EnumerateDevices(
+        devices_to_enumerate,
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
     EXPECT_EQ(num_video_input_devices,
               enumeration[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size());
@@ -446,6 +528,8 @@
   EXPECT_CALL(*this, MockCallback(_))
       .Times(2 * kNumCalls)
       .WillRepeatedly(SaveArg<0>(&enumeration));
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _))
+      .Times(2);
 
   size_t num_audio_input_devices = 5;
   size_t num_video_input_devices = 4;
@@ -465,8 +549,8 @@
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
     EXPECT_EQ(num_audio_input_devices,
               enumeration[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size());
@@ -477,9 +561,20 @@
   }
 
   // Simulate device changes
+  size_t old_num_audio_input_devices = num_audio_input_devices;
+  size_t old_num_video_input_devices = num_video_input_devices;
   num_audio_input_devices = 3;
   num_video_input_devices = 2;
   num_audio_output_devices = 4;
+  ASSERT_LT(num_audio_input_devices, old_num_audio_input_devices);
+  ASSERT_LT(num_video_input_devices, old_num_video_input_devices);
+  size_t num_removed_input_devices =
+      old_num_audio_input_devices - num_audio_input_devices +
+      old_num_video_input_devices - num_video_input_devices;
+  EXPECT_CALL(media_devices_manager_client_, StopRemovedInputDevice(_, _))
+      .Times(num_removed_input_devices);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _))
+      .Times(2);
   audio_manager_->SetNumAudioInputDevices(num_audio_input_devices);
   video_capture_device_factory_->SetToDefaultDevicesConfig(
       num_video_input_devices);
@@ -492,8 +587,8 @@
     base::RunLoop run_loop;
     media_devices_manager_->EnumerateDevices(
         devices_to_enumerate,
-        base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                   base::Unretained(this), &run_loop));
+        base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                       base::Unretained(this), &run_loop));
     run_loop.Run();
     EXPECT_EQ(num_audio_input_devices,
               enumeration[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size());
@@ -509,6 +604,8 @@
   EXPECT_CALL(*video_capture_device_factory_, MockGetDeviceDescriptors())
       .Times(3);
   EXPECT_CALL(*audio_manager_, MockGetAudioInputDeviceNames(_)).Times(3);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _))
+      .Times(2);
 
   size_t num_audio_input_devices = 5;
   size_t num_video_input_devices = 4;
@@ -528,8 +625,8 @@
   base::RunLoop run_loop;
   media_devices_manager_->EnumerateDevices(
       devices_to_enumerate,
-      base::Bind(&MediaDevicesManagerTest::EnumerateCallback,
-                 base::Unretained(this), &run_loop));
+      base::BindOnce(&MediaDevicesManagerTest::EnumerateCallback,
+                     base::Unretained(this), &run_loop));
   run_loop.Run();
 
   // Add device-change event listeners.
@@ -595,9 +692,20 @@
       .WillRepeatedly(SaveArg<1>(&notification_all_audio_output));
 
   // Simulate device changes.
+  size_t old_num_audio_input_devices = num_audio_input_devices;
+  size_t old_num_video_input_devices = num_video_input_devices;
   num_audio_input_devices = 3;
   num_video_input_devices = 2;
   num_audio_output_devices = 4;
+  ASSERT_LT(num_audio_input_devices, old_num_audio_input_devices);
+  ASSERT_LT(num_video_input_devices, old_num_video_input_devices);
+  size_t num_removed_input_devices =
+      old_num_audio_input_devices - num_audio_input_devices +
+      old_num_video_input_devices - num_video_input_devices;
+  EXPECT_CALL(media_devices_manager_client_, StopRemovedInputDevice(_, _))
+      .Times(num_removed_input_devices);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _))
+      .Times(2);
   audio_manager_->SetNumAudioInputDevices(num_audio_input_devices);
   video_capture_device_factory_->SetToDefaultDevicesConfig(
       num_video_input_devices);
@@ -626,9 +734,20 @@
 
   // Simulate further device changes. Only the objects still subscribed to the
   // device-change events will receive notifications.
+  old_num_audio_input_devices = num_audio_input_devices;
+  old_num_video_input_devices = num_video_input_devices;
   num_audio_input_devices = 2;
   num_video_input_devices = 1;
   num_audio_output_devices = 3;
+  ASSERT_LT(num_audio_input_devices, old_num_audio_input_devices);
+  ASSERT_LT(num_video_input_devices, old_num_video_input_devices);
+  num_removed_input_devices =
+      old_num_audio_input_devices - num_audio_input_devices +
+      old_num_video_input_devices - num_video_input_devices;
+  EXPECT_CALL(media_devices_manager_client_, StopRemovedInputDevice(_, _))
+      .Times(num_removed_input_devices);
+  EXPECT_CALL(media_devices_manager_client_, InputDevicesChangedUI(_, _))
+      .Times(2);
   audio_manager_->SetNumAudioInputDevices(num_audio_input_devices);
   video_capture_device_factory_->SetToDefaultDevicesConfig(
       num_video_input_devices);
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index 2119e48b..ca22a78 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -1385,8 +1385,14 @@
                               base::BindRepeating(&SendVideoCaptureLogMessage));
   video_capture_manager_->RegisterListener(this);
 
-  media_devices_manager_.reset(
-      new MediaDevicesManager(audio_system_, video_capture_manager_, this));
+  // Using base::Unretained(this) is safe because |this| owns and therefore
+  // outlives |media_devices_manager_|.
+  media_devices_manager_.reset(new MediaDevicesManager(
+      audio_system_, video_capture_manager_,
+      base::BindRepeating(&MediaStreamManager::StopRemovedDevice,
+                          base::Unretained(this)),
+      base::BindRepeating(&MediaStreamManager::NotifyDevicesChanged,
+                          base::Unretained(this))));
 }
 
 void MediaStreamManager::Opened(MediaStreamType stream_type,
diff --git a/content/browser/renderer_host/media/old_render_frame_audio_input_stream_factory.cc b/content/browser/renderer_host/media/old_render_frame_audio_input_stream_factory.cc
index 0252b25..6e33963e 100644
--- a/content/browser/renderer_host/media/old_render_frame_audio_input_stream_factory.cc
+++ b/content/browser/renderer_host/media/old_render_frame_audio_input_stream_factory.cc
@@ -46,8 +46,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   MediaDevicesManager::BoolDeviceTypes device_types;
   device_types[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = true;
-  media_devices_manager->EnumerateDevices(
-      device_types, base::BindRepeating(cb, salt_and_origin));
+  media_devices_manager->EnumerateDevices(device_types,
+                                          base::BindOnce(cb, salt_and_origin));
 }
 
 }  // namespace
diff --git a/content/browser/renderer_host/media/render_frame_audio_input_stream_factory.cc b/content/browser/renderer_host/media/render_frame_audio_input_stream_factory.cc
index 7a264cbd..a073941 100644
--- a/content/browser/renderer_host/media/render_frame_audio_input_stream_factory.cc
+++ b/content/browser/renderer_host/media/render_frame_audio_input_stream_factory.cc
@@ -4,6 +4,7 @@
 
 #include "content/browser/renderer_host/media/render_frame_audio_input_stream_factory.h"
 
+#include <string>
 #include <utility>
 
 #include "base/trace_event/trace_event.h"
@@ -45,8 +46,8 @@
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   MediaDevicesManager::BoolDeviceTypes device_types;
   device_types[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT] = true;
-  media_stream_manager->media_devices_manager()->EnumerateDevices(device_types,
-                                                                  cb);
+  media_stream_manager->media_devices_manager()->EnumerateDevices(
+      device_types, std::move(cb));
 }
 
 void TranslateDeviceId(const std::string& device_id,
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h
index fd99f95..0e0484e4 100644
--- a/content/browser/service_worker/embedded_worker_instance.h
+++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -41,6 +41,11 @@
 class ServiceWorkerContextCore;
 class ServiceWorkerVersion;
 
+namespace service_worker_new_script_loader_unittest {
+class ServiceWorkerNewScriptLoaderTest;
+FORWARD_DECLARE_TEST(ServiceWorkerNewScriptLoaderTest, AccessedNetwork);
+}  // namespace service_worker_new_script_loader_unittest
+
 // This gives an interface to control one EmbeddedWorker instance, which
 // may be 'in-waiting' or running in one of the child processes added by
 // AddProcessReference().
@@ -220,7 +225,9 @@
   FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StartAndStop);
   FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, DetachDuringStart);
   FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StopDuringStart);
-  FRIEND_TEST_ALL_PREFIXES(ServiceWorkerNewScriptLoaderTest, AccessedNetwork);
+  FRIEND_TEST_ALL_PREFIXES(service_worker_new_script_loader_unittest::
+                               ServiceWorkerNewScriptLoaderTest,
+                           AccessedNetwork);
 
   // Constructor is called via EmbeddedWorkerRegistry::CreateWorker().
   // This instance holds a ref of |registry|.
diff --git a/content/browser/service_worker/embedded_worker_instance_unittest.cc b/content/browser/service_worker/embedded_worker_instance_unittest.cc
index f5d2cbe..17c6553 100644
--- a/content/browser/service_worker/embedded_worker_instance_unittest.cc
+++ b/content/browser/service_worker/embedded_worker_instance_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "content/browser/service_worker/embedded_worker_registry.h"
 #include "content/browser/service_worker/embedded_worker_status.h"
 #include "content/browser/service_worker/embedded_worker_test_helper.h"
@@ -28,6 +29,7 @@
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
 
@@ -97,7 +99,7 @@
   DISALLOW_COPY_AND_ASSIGN(ProviderHostEndpoints);
 };
 
-class EmbeddedWorkerInstanceTest : public testing::Test,
+class EmbeddedWorkerInstanceTest : public testing::TestWithParam<bool>,
                                    public EmbeddedWorkerInstance::Listener {
  protected:
   EmbeddedWorkerInstanceTest()
@@ -136,6 +138,13 @@
   }
 
   void SetUp() override {
+    if (GetParam()) {
+      scoped_feature_list_.InitAndEnableFeature(
+          blink::features::kServiceWorkerServicification);
+    } else {
+      scoped_feature_list_.InitAndDisableFeature(
+          blink::features::kServiceWorkerServicification);
+    }
     helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath()));
   }
 
@@ -258,6 +267,7 @@
   TestBrowserThreadBundle thread_bundle_;
   std::unique_ptr<EmbeddedWorkerTestHelper> helper_;
   std::vector<EventLog> events_;
+  base::test::ScopedFeatureList scoped_feature_list_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceTest);
@@ -317,7 +327,7 @@
       instance_host_ptr_map_;
 };
 
-TEST_F(EmbeddedWorkerInstanceTest, StartAndStop) {
+TEST_P(EmbeddedWorkerInstanceTest, StartAndStop) {
   const GURL pattern("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -364,7 +374,7 @@
 
 // Test that a worker that failed twice will use a new render process
 // on the next attempt.
-TEST_F(EmbeddedWorkerInstanceTest, ForceNewProcess) {
+TEST_P(EmbeddedWorkerInstanceTest, ForceNewProcess) {
   const GURL pattern("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -421,7 +431,7 @@
   }
 }
 
-TEST_F(EmbeddedWorkerInstanceTest, StopWhenDevToolsAttached) {
+TEST_P(EmbeddedWorkerInstanceTest, StopWhenDevToolsAttached) {
   const GURL pattern("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -465,7 +475,7 @@
 
 // Test that the removal of a worker from the registry doesn't remove
 // other workers in the same process.
-TEST_F(EmbeddedWorkerInstanceTest, RemoveWorkerInSharedProcess) {
+TEST_P(EmbeddedWorkerInstanceTest, RemoveWorkerInSharedProcess) {
   const GURL pattern("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -526,7 +536,7 @@
   worker2->Stop();
 }
 
-TEST_F(EmbeddedWorkerInstanceTest, DetachDuringProcessAllocation) {
+TEST_P(EmbeddedWorkerInstanceTest, DetachDuringProcessAllocation) {
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -559,7 +569,7 @@
   EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[0].status);
 }
 
-TEST_F(EmbeddedWorkerInstanceTest, DetachAfterSendingStartWorkerMessage) {
+TEST_P(EmbeddedWorkerInstanceTest, DetachAfterSendingStartWorkerMessage) {
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -600,7 +610,7 @@
   EXPECT_EQ(EmbeddedWorkerStatus::STARTING, events_[0].status);
 }
 
-TEST_F(EmbeddedWorkerInstanceTest, StopDuringProcessAllocation) {
+TEST_P(EmbeddedWorkerInstanceTest, StopDuringProcessAllocation) {
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -670,7 +680,7 @@
   bool* const was_resume_after_download_called_;
 };
 
-TEST_F(EmbeddedWorkerInstanceTest, StopDuringPausedAfterDownload) {
+TEST_P(EmbeddedWorkerInstanceTest, StopDuringPausedAfterDownload) {
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -707,7 +717,7 @@
   EXPECT_FALSE(was_resume_after_download_called);
 }
 
-TEST_F(EmbeddedWorkerInstanceTest, StopAfterSendingStartWorkerMessage) {
+TEST_P(EmbeddedWorkerInstanceTest, StopAfterSendingStartWorkerMessage) {
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -771,7 +781,7 @@
   worker->Stop();
 }
 
-TEST_F(EmbeddedWorkerInstanceTest, Detach) {
+TEST_P(EmbeddedWorkerInstanceTest, Detach) {
   const GURL pattern("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -805,7 +815,7 @@
 }
 
 // Test for when sending the start IPC failed.
-TEST_F(EmbeddedWorkerInstanceTest, FailToSendStartIPC) {
+TEST_P(EmbeddedWorkerInstanceTest, FailToSendStartIPC) {
   const GURL pattern("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -847,7 +857,7 @@
   }
 };
 
-TEST_F(EmbeddedWorkerInstanceTest, RemoveRemoteInterface) {
+TEST_P(EmbeddedWorkerInstanceTest, RemoveRemoteInterface) {
   const GURL pattern("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
@@ -900,7 +910,7 @@
       messages_;
 };
 
-TEST_F(EmbeddedWorkerInstanceTest, AddMessageToConsole) {
+TEST_P(EmbeddedWorkerInstanceTest, AddMessageToConsole) {
   const GURL pattern("http://example.com/");
   const GURL url("http://example.com/worker.js");
   std::unique_ptr<StoreMessageInstanceClient> instance_client =
@@ -982,7 +992,7 @@
 
 // Test that the worker is given a CacheStoragePtr during startup, when
 // |pause_after_download| is false.
-TEST_F(EmbeddedWorkerInstanceTest, CacheStorageOptimization) {
+TEST_P(EmbeddedWorkerInstanceTest, CacheStorageOptimization) {
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
   auto helper = std::make_unique<RecordCacheStorageHelper>();
@@ -1043,4 +1053,8 @@
   }
 }
 
+INSTANTIATE_TEST_CASE_P(IsServiceWorkerServicificationEnabled,
+                        EmbeddedWorkerInstanceTest,
+                        ::testing::Bool(););
+
 }  // namespace content
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index 3bfbcce..2f607b0 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -32,6 +32,7 @@
 #include "mojo/public/cpp/bindings/associated_binding_set.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "net/http/http_util.h"
 #include "services/network/public/mojom/fetch_api.mojom.h"
 #include "storage/common/blob_storage/blob_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -64,6 +65,51 @@
 
 }  // namespace
 
+// A URLLoaderFactory that returns 200 OK with a simple body to any request.
+class EmbeddedWorkerTestHelper::MockNetworkURLLoaderFactory final
+    : public network::mojom::URLLoaderFactory {
+ public:
+  MockNetworkURLLoaderFactory() = default;
+
+  // network::mojom::URLLoaderFactory implementation.
+  void CreateLoaderAndStart(network::mojom::URLLoaderRequest request,
+                            int32_t routing_id,
+                            int32_t request_id,
+                            uint32_t options,
+                            const network::ResourceRequest& url_request,
+                            network::mojom::URLLoaderClientPtr client,
+                            const net::MutableNetworkTrafficAnnotationTag&
+                                traffic_annotation) override {
+    std::string headers = "HTTP/1.1 200 OK\n\n";
+    net::HttpResponseInfo info;
+    info.headers = new net::HttpResponseHeaders(
+        net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.length()));
+    network::ResourceResponseHead response;
+    response.headers = info.headers;
+    response.headers->GetMimeType(&response.mime_type);
+    client->OnReceiveResponse(response);
+
+    std::string body = "this body came from the network";
+    uint32_t bytes_written = body.size();
+    mojo::DataPipe data_pipe;
+    data_pipe.producer_handle->WriteData(body.data(), &bytes_written,
+                                         MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
+    client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
+
+    network::URLLoaderCompletionStatus status;
+    status.error_code = net::OK;
+    client->OnComplete(status);
+  }
+
+  void Clone(network::mojom::URLLoaderFactoryRequest request) override {
+    bindings_.AddBinding(this, std::move(request));
+  }
+
+ private:
+  mojo::BindingSet<network::mojom::URLLoaderFactory> bindings_;
+  DISALLOW_COPY_AND_ASSIGN(MockNetworkURLLoaderFactory);
+};
+
 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::
     MockEmbeddedWorkerInstanceClient(
         base::WeakPtr<EmbeddedWorkerTestHelper> helper)
@@ -389,11 +435,6 @@
 
 EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(
     const base::FilePath& user_data_directory)
-    : EmbeddedWorkerTestHelper(user_data_directory, nullptr) {}
-
-EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(
-    const base::FilePath& user_data_directory,
-    scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter)
     : browser_context_(std::make_unique<TestBrowserContext>()),
       render_process_host_(
           std::make_unique<MockRenderProcessHost>(browser_context_.get())),
@@ -405,7 +446,8 @@
       next_thread_id_(0),
       mock_render_process_id_(render_process_host_->GetID()),
       new_mock_render_process_id_(new_render_process_host_->GetID()),
-      url_loader_factory_getter_(std::move(url_loader_factory_getter)),
+      url_loader_factory_getter_(
+          base::MakeRefCounted<URLLoaderFactoryGetter>()),
       weak_factory_(this) {
   scoped_refptr<base::SequencedTaskRunner> database_task_runner =
       base::ThreadTaskRunnerHandle::Get();
@@ -435,6 +477,22 @@
           new_renderer_interface_ptr.get()));
   new_render_process_host_->OverrideRendererInterfaceForTesting(
       std::move(new_renderer_interface_ptr));
+
+  if (ServiceWorkerUtils::IsServicificationEnabled()) {
+    default_network_loader_factory_ =
+        std::make_unique<MockNetworkURLLoaderFactory>();
+    SetNetworkFactory(default_network_loader_factory_.get());
+  }
+}
+
+void EmbeddedWorkerTestHelper::SetNetworkFactory(
+    network::mojom::URLLoaderFactory* factory) {
+  if (!factory)
+    factory = default_network_loader_factory_.get();
+
+  url_loader_factory_getter_->SetNetworkFactoryForTesting(factory);
+  render_process_host_->OverrideURLLoaderFactory(factory);
+  new_render_process_host_->OverrideURLLoaderFactory(factory);
 }
 
 EmbeddedWorkerTestHelper::~EmbeddedWorkerTestHelper() {
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h
index 18b21c0..49fef64 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.h
+++ b/content/browser/service_worker/embedded_worker_test_helper.h
@@ -141,6 +141,10 @@
     return url_loader_factory_getter_.get();
   }
 
+  // Overrides the network URLLoaderFactory for subsequent requests. Passing a
+  // null pointer will restore the default behavior.
+  void SetNetworkFactory(network::mojom::URLLoaderFactory* factory);
+
  protected:
   // StartWorker IPC handler routed through MockEmbeddedWorkerInstanceClient.
   // This simulates behaviors in the renderer process. Binds
@@ -257,6 +261,7 @@
   }
 
  private:
+  class MockNetworkURLLoaderFactory;
   class MockServiceWorkerEventDispatcher;
   class MockRendererInterface;
 
@@ -382,6 +387,7 @@
 
   std::vector<Event> events_;
   scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_;
+  std::unique_ptr<MockNetworkURLLoaderFactory> default_network_loader_factory_;
 
   base::WeakPtrFactory<EmbeddedWorkerTestHelper> weak_factory_;
 
diff --git a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
index 838ba5b..4e2b941 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
+++ b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
@@ -27,7 +27,7 @@
 #include "content/public/common/browser_side_navigation_policy.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/test/test_browser_thread_bundle.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
@@ -76,7 +76,7 @@
 
   void SetUp() override {
     Initialize(std::make_unique<EmbeddedWorkerTestHelper>(base::FilePath()));
-    mojo::edk::SetDefaultProcessErrorCallback(base::BindRepeating(
+    mojo::core::SetDefaultProcessErrorCallback(base::BindRepeating(
         &ServiceWorkerDispatcherHostTest::OnMojoError, base::Unretained(this)));
   }
 
@@ -84,8 +84,8 @@
     version_ = nullptr;
     registration_ = nullptr;
     helper_.reset();
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   void OnMojoError(const std::string& error) { bad_messages_.push_back(error); }
diff --git a/content/browser/service_worker/service_worker_navigation_loader_unittest.cc b/content/browser/service_worker/service_worker_navigation_loader_unittest.cc
index 5771f29..a15fb8d 100644
--- a/content/browser/service_worker/service_worker_navigation_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_navigation_loader_unittest.cc
@@ -20,7 +20,6 @@
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/cpp/system/data_pipe_utils.h"
-#include "net/http/http_util.h"
 #include "net/ssl/ssl_info.h"
 #include "net/test/cert_test_util.h"
 #include "net/test/test_data_directory.h"
@@ -55,7 +54,8 @@
 // 1. ServiceWorkerNavigationLoader asks ServiceWorkerFetchDispatcher to start
 //    navigation preload.
 // 2. ServiceWorkerFetchDispatcher starts the network request which is mocked
-//    by MockNetworkURLLoaderFactory. The response is sent to
+//    by EmbeddedWorkerTestHelper's default network loader factory. The
+//    response is sent to
 //    ServiceWorkerFetchDispatcher::DelegatingURLLoaderClient.
 // 3. DelegatingURLLoaderClient sends the response to the |preload_handle|
 //    that was passed to Helper::OnFetchEvent().
@@ -150,68 +150,11 @@
   DISALLOW_COPY_AND_ASSIGN(NavigationPreloadLoaderClient);
 };
 
-// A URLLoaderFactory that returns 200 OK with a simple body to any request.
-//
-// ServiceWorkerNavigationLoaderTest sets the network factory for
-// ServiceWorkerContextCore to MockNetworkURLLoaderFactory. So far, it's only
-// used for navigation preload in these tests.
-class MockNetworkURLLoaderFactory final
-    : public network::mojom::URLLoaderFactory {
- public:
-  MockNetworkURLLoaderFactory() = default;
-
-  // network::mojom::URLLoaderFactory implementation.
-  void CreateLoaderAndStart(network::mojom::URLLoaderRequest request,
-                            int32_t routing_id,
-                            int32_t request_id,
-                            uint32_t options,
-                            const network::ResourceRequest& url_request,
-                            network::mojom::URLLoaderClientPtr client,
-                            const net::MutableNetworkTrafficAnnotationTag&
-                                traffic_annotation) override {
-    std::string headers = "HTTP/1.1 200 OK\n\n";
-    net::HttpResponseInfo info;
-    info.headers = new net::HttpResponseHeaders(
-        net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.length()));
-    network::ResourceResponseHead response;
-    response.headers = info.headers;
-    response.headers->GetMimeType(&response.mime_type);
-    client->OnReceiveResponse(response);
-
-    std::string body = "this body came from the network";
-    uint32_t bytes_written = body.size();
-    mojo::DataPipe data_pipe;
-    data_pipe.producer_handle->WriteData(body.data(), &bytes_written,
-                                         MOJO_WRITE_DATA_FLAG_ALL_OR_NONE);
-    client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));
-
-    network::URLLoaderCompletionStatus status;
-    status.error_code = net::OK;
-    client->OnComplete(status);
-  }
-
-  void Clone(network::mojom::URLLoaderFactoryRequest request) override {
-    bindings_.AddBinding(this, std::move(request));
-  }
-
- private:
-  mojo::BindingSet<network::mojom::URLLoaderFactory> bindings_;
-  DISALLOW_COPY_AND_ASSIGN(MockNetworkURLLoaderFactory);
-};
-
 // Helper simulates a service worker handling fetch events. The response can be
 // customized via RespondWith* functions.
 class Helper : public EmbeddedWorkerTestHelper {
  public:
-  Helper()
-      : EmbeddedWorkerTestHelper(
-            base::FilePath(),
-            base::MakeRefCounted<URLLoaderFactoryGetter>()) {
-    url_loader_factory_getter()->SetNetworkFactoryForTesting(
-        &mock_url_loader_factory_);
-    mock_render_process_host()->OverrideURLLoaderFactory(
-        &mock_url_loader_factory_);
-  }
+  Helper() : EmbeddedWorkerTestHelper(base::FilePath()) {}
   ~Helper() override = default;
 
   // Tells this helper to respond to fetch events with the specified blob.
@@ -451,7 +394,6 @@
   // For ResponseMode::kRedirect.
   GURL redirected_url_;
 
-  MockNetworkURLLoaderFactory mock_url_loader_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(Helper);
 };
@@ -491,12 +433,12 @@
       public ServiceWorkerNavigationLoader::Delegate {
  public:
   ServiceWorkerNavigationLoaderTest()
-      : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP),
-        helper_(std::make_unique<Helper>()) {}
+      : thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP) {}
   ~ServiceWorkerNavigationLoaderTest() override = default;
 
   void SetUp() override {
     feature_list_.InitAndEnableFeature(network::features::kNetworkService);
+    helper_ = std::make_unique<Helper>();
 
     // Create an active service worker.
     storage()->LazyInitializeForTest(base::DoNothing());
diff --git a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
index 3921ee0..890f368f 100644
--- a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
@@ -30,8 +30,7 @@
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
 
 namespace content {
-
-namespace {
+namespace service_worker_new_script_loader_unittest {
 
 const char kNormalScriptURL[] = "https://example.com/normal.js";
 const char kNormalImportedScriptURL[] =
@@ -68,11 +67,6 @@
 };
 
 // A URLLoaderFactory that returns a mocked response provided by MockHTTPServer.
-//
-// TODO(nhiroki): We copied this from
-// service_worker_navigation_loader_unittest.cc instead of making it a common
-// test helper because we might want to customize the mock factory to add more
-// tests later. Merge this and that if we're convinced it's better.
 class MockNetworkURLLoaderFactory final
     : public network::mojom::URLLoaderFactory {
  public:
@@ -149,8 +143,6 @@
   DISALLOW_COPY_AND_ASSIGN(MockNetworkURLLoaderFactory);
 };
 
-}  // namespace
-
 // ServiceWorkerNewScriptLoaderTest is for testing the handling of requests for
 // installing service worker scripts via ServiceWorkerNewScriptLoader.
 class ServiceWorkerNewScriptLoaderTest : public testing::Test {
@@ -163,8 +155,7 @@
   ServiceWorkerContextCore* context() { return helper_->context(); }
 
   void SetUp() override {
-    helper_ = std::make_unique<EmbeddedWorkerTestHelper>(
-        base::FilePath(), base::MakeRefCounted<URLLoaderFactoryGetter>());
+    helper_ = std::make_unique<EmbeddedWorkerTestHelper>(base::FilePath());
 
     InitializeStorage();
 
@@ -185,8 +176,7 @@
     network::mojom::URLLoaderFactoryPtr test_loader_factory;
     mock_url_loader_factory_ =
         std::make_unique<MockNetworkURLLoaderFactory>(mock_server_.get());
-    helper_->url_loader_factory_getter()->SetNetworkFactoryForTesting(
-        mock_url_loader_factory_.get());
+    helper_->SetNetworkFactory(mock_url_loader_factory_.get());
   }
 
   void InitializeStorage() {
@@ -910,4 +900,5 @@
   EXPECT_FALSE(version_->embedded_worker()->network_accessed_for_script());
 }
 
+}  // namespace service_worker_new_script_loader_unittest
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_provider_host_unittest.cc b/content/browser/service_worker/service_worker_provider_host_unittest.cc
index 977e047..1855c4ec 100644
--- a/content/browser/service_worker/service_worker_provider_host_unittest.cc
+++ b/content/browser/service_worker/service_worker_provider_host_unittest.cc
@@ -27,7 +27,7 @@
 #include "content/public/test/test_utils.h"
 #include "content/test/test_content_browser_client.h"
 #include "content/test/test_content_client.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
@@ -86,7 +86,7 @@
     old_content_browser_client_ =
         SetBrowserClientForTesting(&test_content_browser_client_);
     ResetSchemesAndOriginsWhitelist();
-    mojo::edk::SetDefaultProcessErrorCallback(base::Bind(
+    mojo::core::SetDefaultProcessErrorCallback(base::Bind(
         &ServiceWorkerProviderHostTest::OnMojoError, base::Unretained(this)));
 
     helper_.reset(new EmbeddedWorkerTestHelper(base::FilePath()));
@@ -117,8 +117,8 @@
     SetBrowserClientForTesting(old_content_browser_client_);
     // Reset cached security schemes so we don't affect other tests.
     ResetSchemesAndOriginsWhitelist();
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   ServiceWorkerRemoteProviderEndpoint PrepareServiceWorkerProviderHost(
diff --git a/content/browser/service_worker/service_worker_registration_unittest.cc b/content/browser/service_worker/service_worker_registration_unittest.cc
index 12ab96a..d6ffd7f 100644
--- a/content/browser/service_worker/service_worker_registration_unittest.cc
+++ b/content/browser/service_worker/service_worker_registration_unittest.cc
@@ -25,7 +25,7 @@
 #include "content/common/service_worker/service_worker_utils.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/test/test_content_browser_client.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
@@ -660,14 +660,14 @@
  protected:
   void SetUp() override {
     ServiceWorkerRegistrationTest::SetUp();
-    mojo::edk::SetDefaultProcessErrorCallback(base::AdaptCallbackForRepeating(
+    mojo::core::SetDefaultProcessErrorCallback(base::AdaptCallbackForRepeating(
         base::BindOnce(&ServiceWorkerRegistrationObjectHostTest::OnMojoError,
                        base::Unretained(this))));
   }
 
   void TearDown() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
     ServiceWorkerRegistrationTest::TearDown();
   }
 
diff --git a/content/browser/snapshot_browsertest.cc b/content/browser/snapshot_browsertest.cc
index e423822..8577567d 100644
--- a/content/browser/snapshot_browsertest.cc
+++ b/content/browser/snapshot_browsertest.cc
@@ -252,8 +252,7 @@
 //   Linux Chromium OS ASAN LSAN Tests (1)
 //   Linux TSAN Tests
 // See crbug.com/771119
-#if (defined(OS_WIN) && !defined(NDEBUG)) ||                \
-    (defined(OS_CHROMEOS) && defined(ADDRESS_SANITIZER)) || \
+#if (defined(OS_WIN) && !defined(NDEBUG)) || (defined(OS_CHROMEOS)) || \
     (defined(OS_LINUX) && defined(THREAD_SANITIZER))
 #define MAYBE_SyncMultiWindowTest DISABLED_SyncMultiWindowTest
 #define MAYBE_AsyncMultiWindowTest DISABLED_AsyncMultiWindowTest
diff --git a/content/browser/web_package/signed_exchange_handler_unittest.cc b/content/browser/web_package/signed_exchange_handler_unittest.cc
index 18746df..9f22d11 100644
--- a/content/browser/web_package/signed_exchange_handler_unittest.cc
+++ b/content/browser/web_package/signed_exchange_handler_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/web_package/signed_exchange_handler.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/files/file_path.h"
@@ -101,11 +103,20 @@
 
 class GMockCertVerifier : public net::CertVerifier {
  public:
-  MOCK_METHOD6(Verify,
+  // net::CompletionOnceCallback is move-only, which GMock does not support.
+  int Verify(const net::CertVerifier::RequestParams& params,
+             net::CRLSet* crl_set,
+             net::CertVerifyResult* verify_result,
+             net::CompletionOnceCallback callback,
+             std::unique_ptr<net::CertVerifier::Request>* out_req,
+             const net::NetLogWithSource& net_log) override {
+    return VerifyImpl(params, crl_set, verify_result, out_req, net_log);
+  }
+
+  MOCK_METHOD5(VerifyImpl,
                int(const net::CertVerifier::RequestParams& params,
                    net::CRLSet* crl_set,
                    net::CertVerifyResult* verify_result,
-                   const net::CompletionCallback& callback,
                    std::unique_ptr<net::CertVerifier::Request>* out_req,
                    const net::NetLogWithSource& net_log));
 };
@@ -614,15 +625,16 @@
       std::make_unique<GMockCertVerifier>();
   EXPECT_CALL(
       *gmock_cert_verifier,
-      Verify(AllOf(Property(&net::CertVerifier::RequestParams::ocsp_response,
-                            kDummyOCSPDer),
-                   Property(&net::CertVerifier::RequestParams::certificate,
-                            CertEqualsIncludingChain(original_cert)),
-                   Property(&net::CertVerifier::RequestParams::hostname,
-                            "test.example.org")),
-             _ /* crl_set */, _ /* verify_result */, _ /* callback */,
-             _ /* out_req */, _ /* net_log */
-             ))
+      VerifyImpl(
+          AllOf(Property(&net::CertVerifier::RequestParams::ocsp_response,
+                         kDummyOCSPDer),
+                Property(&net::CertVerifier::RequestParams::certificate,
+                         CertEqualsIncludingChain(original_cert)),
+                Property(&net::CertVerifier::RequestParams::hostname,
+                         "test.example.org")),
+          _ /* crl_set */, _ /* verify_result */, _ /* out_req */,
+          _ /* net_log */
+          ))
       .WillOnce(DoAll(SetArgPointee<2>(fake_result), Return(net::OK)));
   SetCertVerifier(std::move(gmock_cert_verifier));
 
diff --git a/content/browser/webui/web_ui_mojo_browsertest.cc b/content/browser/webui/web_ui_mojo_browsertest.cc
index 553217b..59d693f 100644
--- a/content/browser/webui/web_ui_mojo_browsertest.cc
+++ b/content/browser/webui/web_ui_mojo_browsertest.cc
@@ -13,6 +13,7 @@
 #include "base/run_loop.h"
 #include "base/strings/string_util.h"
 #include "base/threading/thread_restrictions.h"
+#include "build/build_config.h"
 #include "content/browser/webui/web_ui_controller_factory_registry.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/render_frame_host.h"
@@ -280,7 +281,13 @@
             other_shell->web_contents()->GetMainFrame()->GetProcess());
 }
 
-IN_PROC_BROWSER_TEST_F(WebUIMojoTest, NativeMojoAvailable) {
+// Disabled due to flakiness: crbug.com/860385.
+#if defined(OS_ANDROID)
+#define MAYGE_NativeMojoAvailable DISABLED_NativeMojoAvailable
+#else
+#define MAYGE_NativeMojoAvailable NativeMojoAvailable
+#endif
+IN_PROC_BROWSER_TEST_F(WebUIMojoTest, MAYBE_NativeMojoAvailable) {
   // Mojo bindings should be enabled.
   NavigateWithNewWebUI("web_ui_mojo_native.html");
   EXPECT_TRUE(RunBoolFunction("isNativeMojoAvailable()"));
@@ -302,7 +309,13 @@
   EXPECT_FALSE(RunBoolFunction("isNativeMojoAvailable()"));
 }
 
-IN_PROC_BROWSER_TEST_F(WebUIMojoTest, ChromeSendAvailable) {
+// Disabled due to flakiness: crbug.com/860385.
+#if defined(OS_ANDROID)
+#define MAYGE_ChromeSendAvailable DISABLED_ChromeSendAvailable
+#else
+#define MAYGE_ChromeSendAvailable ChromeSendAvailable
+#endif
+IN_PROC_BROWSER_TEST_F(WebUIMojoTest, MAYBE_ChromeSendAvailable) {
   // chrome.send is not available on mojo-only WebUIs.
   NavigateWithNewWebUI("web_ui_mojo_native.html");
   EXPECT_FALSE(RunBoolFunction("isChromeSendAvailable()"));
diff --git a/content/child/BUILD.gn b/content/child/BUILD.gn
index 8319876..23214a9e 100644
--- a/content/child/BUILD.gn
+++ b/content/child/BUILD.gn
@@ -103,7 +103,7 @@
     "//gpu/command_buffer/client",
     "//media",
     "//media/blink",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net",
     "//services/device/public/cpp:device_features",
     "//services/device/public/cpp/power_monitor",
diff --git a/content/child/child_thread_impl.cc b/content/child/child_thread_impl.cc
index 1af2b61..53f41fc 100644
--- a/content/child/child_thread_impl.cc
+++ b/content/child/child_thread_impl.cc
@@ -55,7 +55,7 @@
 #include "ipc/ipc_platform_file.h"
 #include "ipc/ipc_sync_channel.h"
 #include "ipc/ipc_sync_message_filter.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel_endpoint.h"
@@ -464,8 +464,8 @@
 
   mojo::ScopedMessagePipeHandle service_request_pipe;
   if (!IsInBrowserProcess()) {
-    mojo_ipc_support_.reset(new mojo::edk::ScopedIPCSupport(
-        GetIOTaskRunner(), mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST));
+    mojo_ipc_support_.reset(new mojo::core::ScopedIPCSupport(
+        GetIOTaskRunner(), mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST));
     base::Optional<mojo::IncomingInvitation> invitation =
         InitializeMojoIPCChannel();
 
diff --git a/content/child/child_thread_impl.h b/content/child/child_thread_impl.h
index 4e1fd6e..d44813ed 100644
--- a/content/child/child_thread_impl.h
+++ b/content/child/child_thread_impl.h
@@ -47,9 +47,9 @@
 
 namespace mojo {
 class OutgoingInvitation;
-namespace edk {
+namespace core {
 class ScopedIPCSupport;
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
 namespace content {
@@ -222,7 +222,7 @@
   mojom::FontCacheWin* GetFontCacheWin();
 #endif
 
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> mojo_ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> mojo_ipc_support_;
   std::unique_ptr<ServiceManagerConnection> service_manager_connection_;
 
   mojo::BindingSet<mojom::ChildControl> child_control_bindings_;
diff --git a/content/public/browser/devtools_manager_delegate.cc b/content/public/browser/devtools_manager_delegate.cc
index 9d65951..fb83993 100644
--- a/content/public/browser/devtools_manager_delegate.cc
+++ b/content/public/browser/devtools_manager_delegate.cc
@@ -22,6 +22,10 @@
   return std::string();
 }
 
+bool DevToolsManagerDelegate::AllowInspectingWebContents(WebContents* wc) {
+  return true;
+}
+
 DevToolsAgentHost::List DevToolsManagerDelegate::RemoteDebuggingTargets() {
   return DevToolsAgentHost::GetOrCreateAll();
 }
diff --git a/content/public/browser/devtools_manager_delegate.h b/content/public/browser/devtools_manager_delegate.h
index b0f44fee..d0fea8b 100644
--- a/content/public/browser/devtools_manager_delegate.h
+++ b/content/public/browser/devtools_manager_delegate.h
@@ -36,6 +36,9 @@
   // Returns DevToolsAgentHost title to use for given |web_contents| target.
   virtual std::string GetTargetDescription(WebContents* web_contents);
 
+  // Returns whether embedder allows to inspect given |web_contents|.
+  virtual bool AllowInspectingWebContents(WebContents* web_contents);
+
   // Returns all targets embedder would like to report as debuggable
   // remotely.
   virtual DevToolsAgentHost::List RemoteDebuggingTargets();
diff --git a/content/public/common/use_zoom_for_dsf_policy.h b/content/public/common/use_zoom_for_dsf_policy.h
index 9c436f9..1c61de5 100644
--- a/content/public/common/use_zoom_for_dsf_policy.h
+++ b/content/public/common/use_zoom_for_dsf_policy.h
@@ -9,6 +9,10 @@
 
 // A centralized file for base helper methods and policy decisions about use
 // zoom for DSF (i.e., Device Scale Factor).
+//
+// In the renderer, the decision to UseZoomForDSF should come from the
+// CompositorDependencies, not from this global method, so that it can be
+// controlled and injected in tests.
 
 namespace content {
 
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc
index 89925fc5..ba242ab 100644
--- a/content/public/test/render_view_test.cc
+++ b/content/public/test/render_view_test.cc
@@ -27,6 +27,7 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/common/previews_state.h"
 #include "content/public/common/renderer_preferences.h"
+#include "content/public/common/use_zoom_for_dsf_policy.h"
 #include "content/public/renderer/content_renderer_client.h"
 #include "content/public/renderer/render_view_visitor.h"
 #include "content/public/test/frame_load_waiter.h"
@@ -260,9 +261,9 @@
 
   test_io_thread_ =
       std::make_unique<base::TestIOThread>(base::TestIOThread::kAutoStart);
-  ipc_support_ = std::make_unique<mojo::edk::ScopedIPCSupport>(
+  ipc_support_ = std::make_unique<mojo::core::ScopedIPCSupport>(
       test_io_thread_->task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
 
   // Subclasses can set render_thread_ with their own implementation before
   // calling RenderViewTest::SetUp().
@@ -326,7 +327,7 @@
         "en-US", nullptr, ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES);
   }
 
-  compositor_deps_ = std::make_unique<FakeCompositorDependencies>();
+  compositor_deps_ = CreateCompositorDependencies();
   mock_process_ = std::make_unique<MockRenderProcess>();
 
   mojom::CreateViewParamsPtr view_params = mojom::CreateViewParams::New();
@@ -687,6 +688,11 @@
   return initial_visual_properties;
 }
 
+std::unique_ptr<CompositorDependencies>
+RenderViewTest::CreateCompositorDependencies() {
+  return std::make_unique<FakeCompositorDependencies>();
+}
+
 void RenderViewTest::GoToOffset(int offset,
                                 const GURL& url,
                                 const PageState& state) {
diff --git a/content/public/test/render_view_test.h b/content/public/test/render_view_test.h
index 0480151c..5d313f23 100644
--- a/content/public/test/render_view_test.h
+++ b/content/public/test/render_view_test.h
@@ -19,7 +19,7 @@
 #include "content/public/common/main_function_params.h"
 #include "content/public/common/page_state.h"
 #include "content/public/test/mock_render_thread.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/platform.h"
@@ -47,7 +47,7 @@
 class ContentBrowserClient;
 class ContentClient;
 class ContentRendererClient;
-class FakeCompositorDependencies;
+class CompositorDependencies;
 class MockRenderProcess;
 class PageState;
 class RendererMainPlatformDelegate;
@@ -190,6 +190,10 @@
   // Allows a subclass to customize the initial size of the RenderView.
   virtual std::unique_ptr<VisualProperties> InitialVisualProperties();
 
+  // Override this to change the CompositorDependencies for the test.
+  virtual std::unique_ptr<CompositorDependencies>
+  CreateCompositorDependencies();
+
   // testing::Test
   void SetUp() override;
 
@@ -197,7 +201,7 @@
 
   base::test::ScopedTaskEnvironment scoped_task_environment_;
 
-  std::unique_ptr<FakeCompositorDependencies> compositor_deps_;
+  std::unique_ptr<CompositorDependencies> compositor_deps_;
   std::unique_ptr<MockRenderProcess> mock_process_;
   // We use a naked pointer because we don't want to expose RenderViewImpl in
   // the embedder's namespace.
@@ -216,7 +220,7 @@
 
   // For Mojo.
   std::unique_ptr<base::TestIOThread> test_io_thread_;
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
   service_manager::BinderRegistry binder_registry_;
 
 #if defined(OS_MACOSX)
diff --git a/content/renderer/gpu/compositor_dependencies.h b/content/renderer/gpu/compositor_dependencies.h
index 6435755..74da8435 100644
--- a/content/renderer/gpu/compositor_dependencies.h
+++ b/content/renderer/gpu/compositor_dependencies.h
@@ -37,6 +37,7 @@
   virtual bool IsPartialRasterEnabled() = 0;
   virtual bool IsGpuMemoryBufferCompositorResourcesEnabled() = 0;
   virtual bool IsElasticOverscrollEnabled() = 0;
+  virtual bool IsUseZoomForDSFEnabled() = 0;
   virtual scoped_refptr<base::SingleThreadTaskRunner>
   GetCompositorMainThreadTaskRunner() = 0;
   // Returns null if the compositor is in single-threaded mode (ie. there is no
@@ -45,11 +46,14 @@
   GetCompositorImplThreadTaskRunner() = 0;
   virtual blink::scheduler::WebThreadScheduler* GetWebMainThreadScheduler() = 0;
   virtual cc::TaskGraphRunner* GetTaskGraphRunner() = 0;
-  virtual bool IsThreadedAnimationEnabled() = 0;
   virtual bool IsScrollAnimatorEnabled() = 0;
   virtual std::unique_ptr<cc::UkmRecorderFactory>
   CreateUkmRecorderFactory() = 0;
 
+#ifdef OS_ANDROID
+  virtual bool UsingSynchronousCompositing() = 0;
+#endif
+
   virtual ~CompositorDependencies() {}
 };
 
diff --git a/content/renderer/gpu/queue_message_swap_promise_unittest.cc b/content/renderer/gpu/queue_message_swap_promise_unittest.cc
index eb1b54cc..73d68de3 100644
--- a/content/renderer/gpu/queue_message_swap_promise_unittest.cc
+++ b/content/renderer/gpu/queue_message_swap_promise_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "cc/trees/swap_promise.h"
+#include "content/common/render_frame_metadata.mojom.h"
 #include "content/common/view_messages.h"
 #include "content/renderer/gpu/frame_swap_message_queue.h"
 #include "content/renderer/gpu/render_widget_compositor.h"
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index 327a8b12..6ae8f6f2 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -5,34 +5,21 @@
 #include "content/renderer/gpu/render_widget_compositor.h"
 
 #include <stddef.h>
-
-#include <cmath>
-#include <limits>
 #include <string>
 #include <utility>
 
 #include "base/auto_reset.h"
-#include "base/base_switches.h"
 #include "base/callback.h"
-#include "base/command_line.h"
 #include "base/location.h"
-#include "base/logging.h"
-#include "base/numerics/safe_conversions.h"
 #include "base/single_thread_task_runner.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/synchronization/lock.h"
-#include "base/sys_info.h"
 #include "base/task_scheduler/post_task.h"
 #include "base/task_scheduler/task_scheduler.h"
 #include "base/task_scheduler/task_traits.h"
-#include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/values.h"
-#include "build/build_config.h"
 #include "cc/animation/animation_host.h"
 #include "cc/animation/animation_timeline.h"
 #include "cc/base/region.h"
-#include "cc/base/switches.h"
 #include "cc/benchmarks/micro_benchmark.h"
 #include "cc/debug/layer_tree_debug_state.h"
 #include "cc/input/layer_selection_bound.h"
@@ -44,39 +31,19 @@
 #include "cc/trees/render_frame_metadata_observer.h"
 #include "cc/trees/swap_promise.h"
 #include "cc/trees/ukm_manager.h"
-#include "components/viz/common/features.h"
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
 #include "components/viz/common/frame_sinks/copy_output_request.h"
 #include "components/viz/common/frame_sinks/copy_output_result.h"
 #include "components/viz/common/quads/compositor_frame_metadata.h"
 #include "components/viz/common/resources/single_release_callback.h"
-#include "components/viz/common/switches.h"
-#include "content/common/content_switches_internal.h"
-#include "content/common/render_frame_metadata.mojom.h"
-#include "content/public/common/content_client.h"
-#include "content/public/common/content_switches.h"
-#include "content/public/common/screen_info.h"
-#include "content/public/common/use_zoom_for_dsf_policy.h"
-#include "content/public/renderer/content_renderer_client.h"
 #include "content/renderer/gpu/render_widget_compositor_delegate.h"
-#include "content/renderer/render_frame_metadata_observer_impl.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "gpu/command_buffer/service/gpu_switches.h"
-#include "media/base/media_switches.h"
-#include "services/ui/public/cpp/gpu/context_provider_command_buffer.h"
 #include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h"
 #include "third_party/blink/public/platform/web_runtime_features.h"
 #include "third_party/blink/public/platform/web_size.h"
 #include "third_party/blink/public/web/blink.h"
 #include "third_party/blink/public/web/web_selection.h"
-#include "third_party/skia/include/core/SkImage.h"
-#include "ui/base/ui_base_switches.h"
 #include "ui/gfx/presentation_feedback.h"
-#include "ui/gfx/switches.h"
-#include "ui/gl/gl_switches.h"
-#include "ui/native_theme/native_theme_features.h"
-#include "ui/native_theme/overlay_scrollbar_constants_aura.h"
 
 namespace base {
 class Value;
@@ -89,9 +56,6 @@
 namespace content {
 namespace {
 
-const base::Feature kUnpremultiplyAndDitherLowBitDepthTiles = {
-    "UnpremultiplyAndDitherLowBitDepthTiles", base::FEATURE_ENABLED_BY_DEFAULT};
-
 using ReportTimeCallback = blink::WebLayerTreeView::ReportTimeCallback;
 
 class ReportTimeSwapPromise : public cc::SwapPromise {
@@ -168,24 +132,6 @@
   return 0;
 }
 
-bool GetSwitchValueAsInt(const base::CommandLine& command_line,
-                         const std::string& switch_string,
-                         int min_value,
-                         int max_value,
-                         int* result) {
-  std::string string_value = command_line.GetSwitchValueASCII(switch_string);
-  int int_value;
-  if (base::StringToInt(string_value, &int_value) && int_value >= min_value &&
-      int_value <= max_value) {
-    *result = int_value;
-    return true;
-  } else {
-    LOG(WARNING) << "Failed to parse switch " << switch_string << ": "
-                 << string_value;
-    return false;
-  }
-}
-
 gfx::SelectionBound::Type ConvertFromWebSelectionBoundType(
     blink::WebSelectionBound::Type type) {
   if (type == blink::WebSelectionBound::Type::kSelectionLeft)
@@ -221,37 +167,6 @@
   return cc_selection;
 }
 
-gfx::Size CalculateDefaultTileSize(const ScreenInfo& screen_info) {
-  int default_tile_size = 256;
-#if defined(OS_ANDROID)
-  const gfx::Size screen_size = gfx::ScaleToFlooredSize(
-      screen_info.rect.size(), screen_info.device_scale_factor);
-  int display_width = screen_size.width();
-  int display_height = screen_size.height();
-  int numTiles = (display_width * display_height) / (256 * 256);
-  if (numTiles > 16)
-    default_tile_size = 384;
-  if (numTiles >= 40)
-    default_tile_size = 512;
-
-  // Adjust for some resolutions that barely straddle an extra
-  // tile when in portrait mode. This helps worst case scroll/raster
-  // by not needing a full extra tile for each row.
-  constexpr int tolerance = 10;  // To avoid rounding errors.
-  int portrait_width = std::min(display_width, display_height);
-  if (default_tile_size == 256 && std::abs(portrait_width - 768) < tolerance)
-    default_tile_size += 32;
-  if (default_tile_size == 384 && std::abs(portrait_width - 1200) < tolerance)
-    default_tile_size += 32;
-#elif defined(OS_CHROMEOS) || defined(OS_MACOSX)
-  // Use 512 for high DPI (dsf=2.0f) devices.
-  if (screen_info.device_scale_factor >= 2.0f)
-    default_tile_size = 512;
-#endif
-
-  return gfx::Size(default_tile_size, default_tile_size);
-}
-
 // Check cc::BrowserControlsState, and blink::WebBrowserControlsState
 // are kept in sync.
 static_assert(int(blink::kWebBrowserControlsBoth) == int(cc::BOTH),
@@ -308,386 +223,6 @@
   }
 }
 
-// static
-cc::LayerTreeSettings RenderWidgetCompositor::GenerateLayerTreeSettings(
-    CompositorDependencies* compositor_deps,
-    bool is_for_subframe,
-    const ScreenInfo& screen_info) {
-  const bool is_threaded =
-      !!compositor_deps->GetCompositorImplThreadTaskRunner();
-
-  const base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess();
-  cc::LayerTreeSettings settings;
-
-  settings.resource_settings.use_r16_texture =
-      base::FeatureList::IsEnabled(media::kUseR16Texture);
-
-  settings.commit_to_active_tree = !is_threaded;
-  settings.is_layer_tree_for_subframe = is_for_subframe;
-
-  // For web contents, layer transforms should scale up the contents of layers
-  // to keep content always crisp when possible.
-  settings.layer_transforms_should_scale_layer_contents = true;
-
-  settings.main_frame_before_activation_enabled =
-      cmd.HasSwitch(cc::switches::kEnableMainFrameBeforeActivation);
-
-  // Checkerimaging is not supported for synchronous single-threaded mode, which
-  // is what the renderer uses if its not threaded.
-  settings.enable_checker_imaging =
-      !cmd.HasSwitch(cc::switches::kDisableCheckerImaging) && is_threaded;
-
-#if defined(OS_ANDROID)
-  // We can use a more aggressive limit on Android since decodes tend to take
-  // longer on these devices.
-  settings.min_image_bytes_to_checker = 512 * 1024;  // 512kB
-
-  // Re-rasterization of checker-imaged content with software raster can be too
-  // costly on Android.
-  settings.only_checker_images_with_gpu_raster = true;
-#endif
-
-  // TODO(danakj): This should not be a setting O_O; it should change when the
-  // device scale factor on LayerTreeHost changes.
-  settings.default_tile_size = CalculateDefaultTileSize(screen_info);
-  if (cmd.HasSwitch(switches::kDefaultTileWidth)) {
-    int tile_width = 0;
-    GetSwitchValueAsInt(cmd, switches::kDefaultTileWidth, 1,
-                        std::numeric_limits<int>::max(), &tile_width);
-    settings.default_tile_size.set_width(tile_width);
-  }
-  if (cmd.HasSwitch(switches::kDefaultTileHeight)) {
-    int tile_height = 0;
-    GetSwitchValueAsInt(cmd, switches::kDefaultTileHeight, 1,
-                        std::numeric_limits<int>::max(), &tile_height);
-    settings.default_tile_size.set_height(tile_height);
-  }
-
-  int max_untiled_layer_width = settings.max_untiled_layer_size.width();
-  if (cmd.HasSwitch(switches::kMaxUntiledLayerWidth)) {
-    GetSwitchValueAsInt(cmd, switches::kMaxUntiledLayerWidth, 1,
-                        std::numeric_limits<int>::max(),
-                        &max_untiled_layer_width);
-  }
-  int max_untiled_layer_height = settings.max_untiled_layer_size.height();
-  if (cmd.HasSwitch(switches::kMaxUntiledLayerHeight)) {
-    GetSwitchValueAsInt(cmd, switches::kMaxUntiledLayerHeight, 1,
-                        std::numeric_limits<int>::max(),
-                        &max_untiled_layer_height);
-  }
-
-  settings.max_untiled_layer_size =
-      gfx::Size(max_untiled_layer_width, max_untiled_layer_height);
-
-  settings.gpu_rasterization_msaa_sample_count =
-      compositor_deps->GetGpuRasterizationMSAASampleCount();
-  settings.gpu_rasterization_forced =
-      compositor_deps->IsGpuRasterizationForced();
-
-  settings.can_use_lcd_text = compositor_deps->IsLcdTextEnabled();
-  settings.use_zero_copy = compositor_deps->IsZeroCopyEnabled();
-  settings.use_partial_raster = compositor_deps->IsPartialRasterEnabled();
-  settings.enable_elastic_overscroll =
-      compositor_deps->IsElasticOverscrollEnabled();
-  settings.resource_settings.use_gpu_memory_buffer_resources =
-      compositor_deps->IsGpuMemoryBufferCompositorResourcesEnabled();
-
-  // Build LayerTreeSettings from command line args.
-  if (cmd.HasSwitch(cc::switches::kBrowserControlsShowThreshold)) {
-    std::string top_threshold_str =
-        cmd.GetSwitchValueASCII(cc::switches::kBrowserControlsShowThreshold);
-    double show_threshold;
-    if (base::StringToDouble(top_threshold_str, &show_threshold) &&
-        show_threshold >= 0.f && show_threshold <= 1.f)
-      settings.top_controls_show_threshold = show_threshold;
-  }
-
-  if (cmd.HasSwitch(cc::switches::kBrowserControlsHideThreshold)) {
-    std::string top_threshold_str =
-        cmd.GetSwitchValueASCII(cc::switches::kBrowserControlsHideThreshold);
-    double hide_threshold;
-    if (base::StringToDouble(top_threshold_str, &hide_threshold) &&
-        hide_threshold >= 0.f && hide_threshold <= 1.f)
-      settings.top_controls_hide_threshold = hide_threshold;
-  }
-
-  settings.use_layer_lists = cmd.HasSwitch(cc::switches::kEnableLayerLists);
-
-  // The means the renderer compositor has 2 possible modes:
-  // - Threaded compositing with a scheduler.
-  // - Single threaded compositing without a scheduler (for layout tests only).
-  // Using the scheduler in layout tests introduces additional composite steps
-  // that create flakiness.
-  settings.single_thread_proxy_scheduler = false;
-
-  // These flags should be mirrored by UI versions in ui/compositor/.
-  if (cmd.HasSwitch(cc::switches::kShowCompositedLayerBorders))
-    settings.initial_debug_state.show_debug_borders.set();
-  settings.initial_debug_state.show_layer_animation_bounds_rects =
-      cmd.HasSwitch(cc::switches::kShowLayerAnimationBounds);
-  settings.initial_debug_state.show_paint_rects =
-      cmd.HasSwitch(switches::kShowPaintRects);
-  settings.initial_debug_state.show_property_changed_rects =
-      cmd.HasSwitch(cc::switches::kShowPropertyChangedRects);
-  settings.initial_debug_state.show_surface_damage_rects =
-      cmd.HasSwitch(cc::switches::kShowSurfaceDamageRects);
-  settings.initial_debug_state.show_screen_space_rects =
-      cmd.HasSwitch(cc::switches::kShowScreenSpaceRects);
-
-  settings.initial_debug_state.SetRecordRenderingStats(
-      cmd.HasSwitch(cc::switches::kEnableGpuBenchmarking));
-  settings.enable_surface_synchronization =
-      features::IsSurfaceSynchronizationEnabled();
-  settings.build_hit_test_data = features::IsVizHitTestingSurfaceLayerEnabled();
-
-  if (cmd.HasSwitch(cc::switches::kSlowDownRasterScaleFactor)) {
-    const int kMinSlowDownScaleFactor = 0;
-    const int kMaxSlowDownScaleFactor = INT_MAX;
-    GetSwitchValueAsInt(
-        cmd, cc::switches::kSlowDownRasterScaleFactor, kMinSlowDownScaleFactor,
-        kMaxSlowDownScaleFactor,
-        &settings.initial_debug_state.slow_down_raster_scale_factor);
-  }
-
-  // This is default overlay scrollbar settings for Android and DevTools mobile
-  // emulator. Aura Overlay Scrollbar will override below.
-  settings.scrollbar_animator = cc::LayerTreeSettings::ANDROID_OVERLAY;
-  settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128);
-  settings.scrollbar_fade_delay = base::TimeDelta::FromMilliseconds(300);
-  settings.scrollbar_fade_duration = base::TimeDelta::FromMilliseconds(300);
-
-
-#if defined(OS_ANDROID)
-  bool using_synchronous_compositor =
-      GetContentClient()->UsingSynchronousCompositing();
-  bool using_low_memory_policy = base::SysInfo::IsLowEndDevice();
-
-  settings.use_stream_video_draw_quad = true;
-  settings.using_synchronous_renderer_compositor = using_synchronous_compositor;
-  if (using_synchronous_compositor) {
-    // Android WebView uses system scrollbars, so make ours invisible.
-    // http://crbug.com/677348: This can't be done using hide_scrollbars
-    // setting because supporting -webkit custom scrollbars is still desired
-    // on sublayers.
-    settings.scrollbar_animator = cc::LayerTreeSettings::NO_ANIMATOR;
-    settings.solid_color_scrollbar_color = SK_ColorTRANSPARENT;
-
-    settings.enable_early_damage_check =
-        cmd.HasSwitch(cc::switches::kCheckDamageEarly);
-  }
-  // Android WebView handles root layer flings itself.
-  settings.ignore_root_layer_flings = using_synchronous_compositor;
-  // Memory policy on Android WebView does not depend on whether device is
-  // low end, so always use default policy.
-  if (using_low_memory_policy && !using_synchronous_compositor) {
-    // On low-end we want to be very carefull about killing other
-    // apps. So initially we use 50% more memory to avoid flickering
-    // or raster-on-demand.
-    settings.max_memory_for_prepaint_percentage = 67;
-  } else {
-    // On other devices we have increased memory excessively to avoid
-    // raster-on-demand already, so now we reserve 50% _only_ to avoid
-    // raster-on-demand, and use 50% of the memory otherwise.
-    settings.max_memory_for_prepaint_percentage = 50;
-  }
-
-  // TODO(danakj): Only do this on low end devices.
-  settings.create_low_res_tiling = true;
-
-#else  // defined(OS_ANDROID)
-  bool using_synchronous_compositor = false;  // Only for Android WebView.
-  // On desktop, we never use the low memory policy unless we are simulating
-  // low-end mode via a switch.
-  bool using_low_memory_policy =
-      cmd.HasSwitch(switches::kEnableLowEndDeviceMode);
-
-  if (ui::IsOverlayScrollbarEnabled()) {
-    settings.scrollbar_animator = cc::LayerTreeSettings::AURA_OVERLAY;
-    settings.scrollbar_fade_delay = ui::kOverlayScrollbarFadeDelay;
-    settings.scrollbar_fade_duration = ui::kOverlayScrollbarFadeDuration;
-    settings.scrollbar_thinning_duration =
-        ui::kOverlayScrollbarThinningDuration;
-    settings.scrollbar_flash_after_any_scroll_update =
-        ui::OverlayScrollbarFlashAfterAnyScrollUpdate();
-    settings.scrollbar_flash_when_mouse_enter =
-        ui::OverlayScrollbarFlashWhenMouseEnter();
-  }
-
-  // On desktop, if there's over 4GB of memory on the machine, increase the
-  // working set size to 256MB for both gpu and software.
-  const int kImageDecodeMemoryThresholdMB = 4 * 1024;
-  if (base::SysInfo::AmountOfPhysicalMemoryMB() >=
-      kImageDecodeMemoryThresholdMB) {
-    settings.decoded_image_working_set_budget_bytes = 256 * 1024 * 1024;
-  } else {
-    // This is the default, but recorded here as well.
-    settings.decoded_image_working_set_budget_bytes = 128 * 1024 * 1024;
-  }
-#endif  // defined(OS_ANDROID)
-
-  if (using_low_memory_policy) {
-    // RGBA_4444 textures are only enabled:
-    //  - If the user hasn't explicitly disabled them
-    //  - If system ram is <= 512MB (1GB devices are sometimes low-end).
-    //  - If we are not running in a WebView, where 4444 isn't supported.
-    if (!cmd.HasSwitch(switches::kDisableRGBA4444Textures) &&
-        base::SysInfo::AmountOfPhysicalMemoryMB() <= 512 &&
-        !using_synchronous_compositor) {
-      settings.use_rgba_4444 = viz::RGBA_4444;
-
-      // If we are going to unpremultiply and dither these tiles, we need to
-      // allocate an additional RGBA_8888 intermediate for each tile
-      // rasterization when rastering to RGBA_4444 to allow for dithering.
-      // Setting a reasonable sized max tile size allows this intermediate to
-      // be consistently reused.
-      if (base::FeatureList::IsEnabled(
-              kUnpremultiplyAndDitherLowBitDepthTiles)) {
-        settings.max_gpu_raster_tile_size = gfx::Size(512, 256);
-        settings.unpremultiply_and_dither_low_bit_depth_tiles = true;
-      }
-    }
-  }
-
-  if (cmd.HasSwitch(switches::kEnableLowResTiling))
-    settings.create_low_res_tiling = true;
-  if (cmd.HasSwitch(switches::kDisableLowResTiling))
-    settings.create_low_res_tiling = false;
-
-  if (cmd.HasSwitch(switches::kEnableRGBA4444Textures) &&
-      !cmd.HasSwitch(switches::kDisableRGBA4444Textures)) {
-    settings.use_rgba_4444 = true;
-  }
-
-  settings.max_staging_buffer_usage_in_bytes = 32 * 1024 * 1024;  // 32MB
-  // Use 1/4th of staging buffers on low-end devices.
-  if (base::SysInfo::IsLowEndDevice())
-    settings.max_staging_buffer_usage_in_bytes /= 4;
-
-  cc::ManagedMemoryPolicy defaults = settings.memory_policy;
-  settings.memory_policy = GetGpuMemoryPolicy(defaults, screen_info);
-
-  settings.disallow_non_exact_resource_reuse =
-      cmd.HasSwitch(switches::kDisallowNonExactResourceReuse);
-#if defined(OS_ANDROID)
-  // TODO(crbug.com/746931): This feature appears to be causing visual
-  // corruption on certain android devices. Will investigate and re-enable.
-  settings.disallow_non_exact_resource_reuse = true;
-#endif
-
-  if (cmd.HasSwitch(switches::kRunAllCompositorStagesBeforeDraw)) {
-    settings.wait_for_all_pipeline_stages_before_draw = true;
-    settings.enable_latency_recovery = false;
-  }
-
-  settings.enable_image_animation_resync =
-      !cmd.HasSwitch(switches::kDisableImageAnimationResync);
-
-  settings.always_request_presentation_time =
-      cmd.HasSwitch(cc::switches::kAlwaysRequestPresentationTime);
-
-  settings.use_painted_device_scale_factor = IsUseZoomForDSFEnabled();
-  return settings;
-}
-
-// static
-cc::ManagedMemoryPolicy RenderWidgetCompositor::GetGpuMemoryPolicy(
-    const cc::ManagedMemoryPolicy& default_policy,
-    const ScreenInfo& screen_info) {
-  cc::ManagedMemoryPolicy actual = default_policy;
-  actual.bytes_limit_when_visible = 0;
-
-  // If the value was overridden on the command line, use the specified value.
-  static bool client_hard_limit_bytes_overridden =
-      base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kForceGpuMemAvailableMb);
-  if (client_hard_limit_bytes_overridden) {
-    if (base::StringToSizeT(
-            base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-                switches::kForceGpuMemAvailableMb),
-            &actual.bytes_limit_when_visible))
-      actual.bytes_limit_when_visible *= 1024 * 1024;
-    return actual;
-  }
-
-#if defined(OS_ANDROID)
-  // We can't query available GPU memory from the system on Android.
-  // Physical memory is also mis-reported sometimes (eg. Nexus 10 reports
-  // 1262MB when it actually has 2GB, while Razr M has 1GB but only reports
-  // 128MB java heap size). First we estimate physical memory using both.
-  size_t dalvik_mb = base::SysInfo::DalvikHeapSizeMB();
-  size_t physical_mb = base::SysInfo::AmountOfPhysicalMemoryMB();
-  size_t physical_memory_mb = 0;
-  if (base::SysInfo::IsLowEndDevice()) {
-    // TODO(crbug.com/742534): The code below appears to no longer work.
-    // |dalvik_mb| no longer follows the expected heuristic pattern, causing us
-    // to over-estimate memory on low-end devices. This entire section probably
-    // needs to be re-written, but for now we can address the low-end Android
-    // issues by ignoring |dalvik_mb|.
-    physical_memory_mb = physical_mb;
-  } else if (dalvik_mb >= 256) {
-    physical_memory_mb = dalvik_mb * 4;
-  } else {
-    physical_memory_mb = std::max(dalvik_mb * 4, (physical_mb * 4) / 3);
-  }
-
-  // Now we take a default of 1/8th of memory on high-memory devices,
-  // and gradually scale that back for low-memory devices (to be nicer
-  // to other apps so they don't get killed). Examples:
-  // Nexus 4/10(2GB)    256MB (normally 128MB)
-  // Droid Razr M(1GB)  114MB (normally 57MB)
-  // Galaxy Nexus(1GB)  100MB (normally 50MB)
-  // Xoom(1GB)          100MB (normally 50MB)
-  // Nexus S(low-end)   8MB (normally 8MB)
-  // Note that the compositor now uses only some of this memory for
-  // pre-painting and uses the rest only for 'emergencies'.
-  if (actual.bytes_limit_when_visible == 0) {
-    // NOTE: Non-low-end devices use only 50% of these limits,
-    // except during 'emergencies' where 100% can be used.
-    if (physical_memory_mb >= 1536)
-      actual.bytes_limit_when_visible = physical_memory_mb / 8;  // >192MB
-    else if (physical_memory_mb >= 1152)
-      actual.bytes_limit_when_visible = physical_memory_mb / 8;  // >144MB
-    else if (physical_memory_mb >= 768)
-      actual.bytes_limit_when_visible = physical_memory_mb / 10;  // >76MB
-    else if (physical_memory_mb >= 513)
-      actual.bytes_limit_when_visible = physical_memory_mb / 12;  // <64MB
-    else
-      // Devices with this little RAM have very little headroom so we hardcode
-      // the limit rather than relying on the heuristics above.  (They also use
-      // 4444 textures so we can use a lower limit.)
-      actual.bytes_limit_when_visible = 8;
-
-    actual.bytes_limit_when_visible =
-        actual.bytes_limit_when_visible * 1024 * 1024;
-    // Clamp the observed value to a specific range on Android.
-    actual.bytes_limit_when_visible = std::max(
-        actual.bytes_limit_when_visible, static_cast<size_t>(8 * 1024 * 1024));
-    actual.bytes_limit_when_visible =
-        std::min(actual.bytes_limit_when_visible,
-                 static_cast<size_t>(256 * 1024 * 1024));
-  }
-  actual.priority_cutoff_when_visible =
-      gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING;
-#else
-  // Ignore what the system said and give all clients the same maximum
-  // allocation on desktop platforms.
-  actual.bytes_limit_when_visible = 512 * 1024 * 1024;
-  actual.priority_cutoff_when_visible =
-      gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE;
-
-  // For large monitors (4k), double the tile memory to avoid frequent out of
-  // memory problems. 4k could mean a screen width of anywhere from 3840 to 4096
-  // (see https://en.wikipedia.org/wiki/4K_resolution). We use 3500 as a proxy
-  // for "large enough".
-  static const int kLargeDisplayThreshold = 3500;
-  int display_width =
-      std::round(screen_info.rect.width() * screen_info.device_scale_factor);
-  if (display_width >= kLargeDisplayThreshold)
-    actual.bytes_limit_when_visible *= 2;
-#endif
-  return actual;
-}
-
 void RenderWidgetCompositor::SetNeverVisible() {
   DCHECK(!layer_tree_host_->IsVisible());
   never_visible_ = true;
@@ -1284,14 +819,9 @@
   layer_tree_host_->RequestBeginMainFrameNotExpected(new_state);
 }
 
-void RenderWidgetCompositor::CreateRenderFrameObserver(
-    mojom::RenderFrameMetadataObserverRequest request,
-    mojom::RenderFrameMetadataObserverClientPtrInfo client_info) {
-  auto render_frame_metadata_observer =
-      std::make_unique<RenderFrameMetadataObserverImpl>(std::move(request),
-                                                        std::move(client_info));
-  layer_tree_host_->SetRenderFrameObserver(
-      std::move(render_frame_metadata_observer));
+void RenderWidgetCompositor::SetRenderFrameObserver(
+    std::unique_ptr<cc::RenderFrameMetadataObserver> observer) {
+  layer_tree_host_->SetRenderFrameObserver(std::move(observer));
 }
 
 void RenderWidgetCompositor::AddPresentationCallback(
diff --git a/content/renderer/gpu/render_widget_compositor.h b/content/renderer/gpu/render_widget_compositor.h
index 669efbb..45e430f 100644
--- a/content/renderer/gpu/render_widget_compositor.h
+++ b/content/renderer/gpu/render_widget_compositor.h
@@ -16,14 +16,10 @@
 #include "cc/trees/layer_tree_host.h"
 #include "cc/trees/layer_tree_host_client.h"
 #include "cc/trees/layer_tree_host_single_thread_client.h"
-#include "cc/trees/layer_tree_settings.h"
-#include "cc/trees/managed_memory_policy.h"
 #include "cc/trees/swap_promise.h"
 #include "cc/trees/swap_promise_monitor.h"
 #include "content/common/content_export.h"
-#include "content/common/render_frame_metadata.mojom.h"
 #include "content/renderer/gpu/compositor_dependencies.h"
-#include "services/metrics/public/cpp/ukm_recorder.h"
 #include "third_party/blink/public/platform/web_layer_tree_view.h"
 #include "ui/gfx/geometry/rect.h"
 
@@ -33,6 +29,8 @@
 class Layer;
 class LayerTreeFrameSink;
 class LayerTreeHost;
+class LayerTreeSettings;
+class RenderFrameMetadataObserver;
 }
 
 namespace gfx {
@@ -45,7 +43,6 @@
 
 namespace content {
 class RenderWidgetCompositorDelegate;
-struct ScreenInfo;
 
 class CONTENT_EXPORT RenderWidgetCompositor
     : public blink::WebLayerTreeView,
@@ -56,17 +53,8 @@
                          CompositorDependencies* compositor_deps);
   ~RenderWidgetCompositor() override;
 
-  static cc::LayerTreeSettings GenerateLayerTreeSettings(
-      CompositorDependencies* compositor_deps,
-      bool is_for_subframe,
-      const ScreenInfo& screen_info);
-
   void Initialize(const cc::LayerTreeSettings& settings);
 
-  static cc::ManagedMemoryPolicy GetGpuMemoryPolicy(
-      const cc::ManagedMemoryPolicy& policy,
-      const ScreenInfo& screen_info);
-
   void SetNeverVisible();
   const base::WeakPtr<cc::InputHandler>& GetInputHandler();
   void SetNeedsDisplayOnAllLayers();
@@ -204,11 +192,10 @@
     return layer_tree_host_->GetSettings();
   }
 
-  // Creates a cc::RenderFrameMetadataObserver, which is sent to the compositor
+  // Sets the RenderFrameMetadataObserver, which is sent to the compositor
   // thread for binding.
-  void CreateRenderFrameObserver(
-      mojom::RenderFrameMetadataObserverRequest request,
-      mojom::RenderFrameMetadataObserverClientPtrInfo client_info);
+  void SetRenderFrameObserver(
+      std::unique_ptr<cc::RenderFrameMetadataObserver> observer);
 
   void AddPresentationCallback(
       uint32_t frame_token,
diff --git a/content/renderer/gpu/render_widget_compositor_unittest.cc b/content/renderer/gpu/render_widget_compositor_unittest.cc
index b5c3adb5..43b49e2 100644
--- a/content/renderer/gpu/render_widget_compositor_unittest.cc
+++ b/content/renderer/gpu/render_widget_compositor_unittest.cc
@@ -355,36 +355,5 @@
   }
 }
 
-// Verify desktop memory limit calculations.
-#if !defined(OS_ANDROID)
-TEST(RenderWidgetCompositorTest, IgnoreGivenMemoryPolicy) {
-  auto policy = RenderWidgetCompositor::GetGpuMemoryPolicy(
-      cc::ManagedMemoryPolicy(256), ScreenInfo());
-  EXPECT_EQ(512u * 1024u * 1024u, policy.bytes_limit_when_visible);
-  EXPECT_EQ(gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
-            policy.priority_cutoff_when_visible);
-}
-
-TEST(RenderWidgetCompositorTest, LargeScreensUseMoreMemory) {
-  ScreenInfo screen_info;
-
-  screen_info.rect = gfx::Rect(4096, 2160);
-  screen_info.device_scale_factor = 1.f;
-  auto policy = RenderWidgetCompositor::GetGpuMemoryPolicy(
-      cc::ManagedMemoryPolicy(256), screen_info);
-  EXPECT_EQ(2u * 512u * 1024u * 1024u, policy.bytes_limit_when_visible);
-  EXPECT_EQ(gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
-            policy.priority_cutoff_when_visible);
-
-  screen_info.rect = gfx::Rect(2048, 1080);
-  screen_info.device_scale_factor = 2.f;
-  policy = RenderWidgetCompositor::GetGpuMemoryPolicy(
-      cc::ManagedMemoryPolicy(256), screen_info);
-  EXPECT_EQ(2u * 512u * 1024u * 1024u, policy.bytes_limit_when_visible);
-  EXPECT_EQ(gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
-            policy.priority_cutoff_when_visible);
-}
-#endif  // !defined(OS_ANDROID)
-
 }  // namespace
 }  // namespace content
diff --git a/content/renderer/input/input_event_prediction.cc b/content/renderer/input/input_event_prediction.cc
index 72f9153..5b0579d3 100644
--- a/content/renderer/input/input_event_prediction.cc
+++ b/content/renderer/input/input_event_prediction.cc
@@ -9,6 +9,7 @@
 #include "base/metrics/field_trial_params.h"
 #include "content/public/common/content_features.h"
 #include "ui/events/blink/prediction/empty_predictor.h"
+#include "ui/events/blink/prediction/kalman_predictor.h"
 #include "ui/events/blink/prediction/least_squares_predictor.h"
 
 using blink::WebInputEvent;
@@ -23,14 +24,17 @@
 
 constexpr char kPredictor[] = "predictor";
 constexpr char kInputEventPredictorTypeLsq[] = "lsq";
+constexpr char kInputEventPredictorTypeKalman[] = "kalman";
 
 }  // namespace
 
 InputEventPrediction::InputEventPrediction() {
-  std::string predictor_type_ = GetFieldTrialParamValueByFeature(
+  std::string predictor_type = GetFieldTrialParamValueByFeature(
       features::kResamplingInputEvents, kPredictor);
-  if (predictor_type_ == kInputEventPredictorTypeLsq)
+  if (predictor_type == kInputEventPredictorTypeLsq)
     selected_predictor_type_ = PredictorType::kLsq;
+  else if (predictor_type == kInputEventPredictorTypeKalman)
+    selected_predictor_type_ = PredictorType::kKalman;
   else
     selected_predictor_type_ = PredictorType::kEmpty;
 
@@ -70,6 +74,8 @@
       return std::make_unique<ui::EmptyPredictor>();
     case PredictorType::kLsq:
       return std::make_unique<ui::LeastSquaresPredictor>();
+    case PredictorType::kKalman:
+      return std::make_unique<ui::KalmanPredictor>();
   }
 }
 
diff --git a/content/renderer/input/input_event_prediction.h b/content/renderer/input/input_event_prediction.h
index 6c6a3d8..3bcc9ae3 100644
--- a/content/renderer/input/input_event_prediction.h
+++ b/content/renderer/input/input_event_prediction.h
@@ -34,7 +34,7 @@
  private:
   friend class InputEventPredictionTest;
 
-  enum class PredictorType { kEmpty, kLsq };
+  enum class PredictorType { kEmpty, kLsq, kKalman };
 
   // The following three function is for handling multiple TouchPoints in a
   // WebTouchEvent. They should be more neat when WebTouchEvent is elimated.
diff --git a/content/renderer/input/render_widget_input_handler.cc b/content/renderer/input/render_widget_input_handler.cc
index e0eb812..046ea39 100644
--- a/content/renderer/input/render_widget_input_handler.cc
+++ b/content/renderer/input/render_widget_input_handler.cc
@@ -17,7 +17,6 @@
 #include "content/common/input/input_event_ack.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/input_event_ack_state.h"
-#include "content/public/common/use_zoom_for_dsf_policy.h"
 #include "content/public/renderer/render_frame.h"
 #include "content/renderer/gpu/render_widget_compositor.h"
 #include "content/renderer/ime_event_guard.h"
@@ -194,7 +193,7 @@
 viz::FrameSinkId RenderWidgetInputHandler::GetFrameSinkIdAtPoint(
     const gfx::Point& point) {
   gfx::PointF point_in_pixel(point);
-  if (IsUseZoomForDSFEnabled()) {
+  if (widget_->compositor_deps()->IsUseZoomForDSFEnabled()) {
     point_in_pixel = gfx::ConvertPointToPixel(
         widget_->GetOriginalScreenInfo().device_scale_factor, point_in_pixel);
   }
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 0a73067..fc840f2 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -76,6 +76,7 @@
 #include "content/public/common/service_names.mojom.h"
 #include "content/public/common/simple_connection_filter.h"
 #include "content/public/common/url_constants.h"
+#include "content/public/common/use_zoom_for_dsf_policy.h"
 #include "content/public/renderer/content_renderer_client.h"
 #include "content/public/renderer/render_thread_observer.h"
 #include "content/public/renderer/render_view_visitor.h"
@@ -902,6 +903,8 @@
   is_elastic_overscroll_enabled_ = false;
 #endif
 
+  is_zoom_for_dsf_enabled_ = content::IsUseZoomForDSFEnabled();
+
   if (command_line.HasSwitch(switches::kDisableLCDText)) {
     is_lcd_text_enabled_ = false;
   } else if (command_line.HasSwitch(switches::kEnableLCDText)) {
@@ -1606,6 +1609,10 @@
   return is_elastic_overscroll_enabled_;
 }
 
+bool RenderThreadImpl::IsUseZoomForDSFEnabled() {
+  return is_zoom_for_dsf_enabled_;
+}
+
 scoped_refptr<base::SingleThreadTaskRunner>
 RenderThreadImpl::GetCompositorMainThreadTaskRunner() {
   return main_thread_compositor_task_runner_;
@@ -1657,6 +1664,12 @@
   return std::make_unique<UkmRecorderFactoryImpl>(GetConnector()->Clone());
 }
 
+#ifdef OS_ANDROID
+bool RenderThreadImpl::UsingSynchronousCompositing() {
+  return GetContentClient()->UsingSynchronousCompositing();
+}
+#endif
+
 void RenderThreadImpl::OnRAILModeChanged(v8::RAILMode rail_mode) {
   blink::MainThreadIsolate()->SetRAILMode(rail_mode);
   blink::SetRAILModeOnWorkerThreadIsolates(rail_mode);
diff --git a/content/renderer/render_thread_impl.h b/content/renderer/render_thread_impl.h
index f0b613a..958b8f6 100644
--- a/content/renderer/render_thread_impl.h
+++ b/content/renderer/render_thread_impl.h
@@ -248,15 +248,20 @@
   bool IsPartialRasterEnabled() override;
   bool IsGpuMemoryBufferCompositorResourcesEnabled() override;
   bool IsElasticOverscrollEnabled() override;
+  bool IsUseZoomForDSFEnabled() override;
   scoped_refptr<base::SingleThreadTaskRunner>
   GetCompositorMainThreadTaskRunner() override;
   scoped_refptr<base::SingleThreadTaskRunner>
   GetCompositorImplThreadTaskRunner() override;
   blink::scheduler::WebThreadScheduler* GetWebMainThreadScheduler() override;
   cc::TaskGraphRunner* GetTaskGraphRunner() override;
-  bool IsThreadedAnimationEnabled() override;
   bool IsScrollAnimatorEnabled() override;
   std::unique_ptr<cc::UkmRecorderFactory> CreateUkmRecorderFactory() override;
+#ifdef OS_ANDROID
+  bool UsingSynchronousCompositing() override;
+#endif
+
+  bool IsThreadedAnimationEnabled();
 
   // blink::scheduler::WebThreadScheduler::RAILModeObserver implementation.
   void OnRAILModeChanged(v8::RAILMode rail_mode) override;
@@ -738,6 +743,7 @@
   bool is_gpu_memory_buffer_compositor_resources_enabled_;
   bool is_partial_raster_enabled_;
   bool is_elastic_overscroll_enabled_;
+  bool is_zoom_for_dsf_enabled_;
   bool is_threaded_animation_enabled_;
   bool is_scroll_animator_enabled_;
 
diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc
index 217f9b9..3e65072 100644
--- a/content/renderer/render_thread_impl_browsertest.cc
+++ b/content/renderer/render_thread_impl_browsertest.cc
@@ -50,8 +50,8 @@
 #include "gpu/ipc/host/gpu_switches.h"
 #include "ipc/ipc.mojom.h"
 #include "ipc/ipc_channel_mojo.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/system/invitation.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
@@ -209,8 +209,8 @@
         blink::scheduler::GetSingleThreadTaskRunnerForTesting();
 
     InitializeMojo();
-    mojo_ipc_support_.reset(new mojo::edk::ScopedIPCSupport(
-        io_task_runner, mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST));
+    mojo_ipc_support_.reset(new mojo::core::ScopedIPCSupport(
+        io_task_runner, mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST));
     shell_context_.reset(new TestServiceManagerContext);
     mojo::OutgoingInvitation invitation;
     service_manager::Identity child_identity(
@@ -293,7 +293,7 @@
   std::unique_ptr<TestServiceManagerContext> shell_context_;
   std::unique_ptr<ChildConnection> child_connection_;
   std::unique_ptr<IPC::ChannelProxy> channel_;
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> mojo_ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> mojo_ipc_support_;
 
   std::unique_ptr<MockRenderProcess> mock_process_;
   scoped_refptr<QuitOnTestMsgFilter> test_msg_filter_;
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index d0a94e2..b46f677 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -57,6 +57,7 @@
 #include "content/renderer/service_worker/service_worker_network_provider.h"
 #include "content/shell/browser/shell.h"
 #include "content/shell/browser/shell_browser_context.h"
+#include "content/test/fake_compositor_dependencies.h"
 #include "content/test/mock_keyboard.h"
 #include "content/test/test_render_frame.h"
 #include "net/base/net_errors.h"
@@ -441,8 +442,16 @@
   void SetUp() override {}
 };
 
-class RenderViewImplScaleFactorTest : public RenderViewImplBlinkSettingsTest {
+// This test class enables UseZoomForDSF based on the platform default value.
+class RenderViewImplScaleFactorTest : public RenderViewImplTest {
  protected:
+  std::unique_ptr<CompositorDependencies> CreateCompositorDependencies()
+      override {
+    auto deps = std::make_unique<FakeCompositorDependencies>();
+    deps->set_use_zoom_for_dsf_enabled(content::IsUseZoomForDSFEnabled());
+    return deps;
+  }
+
   void SetDeviceScaleFactor(float dsf) {
     VisualProperties visual_properties;
     visual_properties.screen_info.device_scale_factor = dsf;
@@ -493,7 +502,31 @@
   }
 };
 
-class RenderViewImplZoomTest : public RenderViewImplTest {
+// This test class forces UseZoomForDSF to be on for all platforms.
+class RenderViewImplEnableZoomForDSFTest
+    : public RenderViewImplScaleFactorTest {
+ protected:
+  std::unique_ptr<CompositorDependencies> CreateCompositorDependencies()
+      override {
+    auto deps = std::make_unique<FakeCompositorDependencies>();
+    deps->set_use_zoom_for_dsf_enabled(true);
+    return deps;
+  }
+};
+
+// This test class forces UseZoomForDSF to be off for all platforms.
+class RenderViewImplDisableZoomForDSFTest
+    : public RenderViewImplScaleFactorTest {
+ protected:
+  std::unique_ptr<CompositorDependencies> CreateCompositorDependencies()
+      override {
+    auto deps = std::make_unique<FakeCompositorDependencies>();
+    deps->set_use_zoom_for_dsf_enabled(false);
+    return deps;
+  }
+};
+
+class RenderViewImplZoomTest : public RenderViewImplScaleFactorTest {
  protected:
   void SetZoomLevel(bool uses_temporary_zoom, double zoom_level) {
     view()->SetZoomLevelForTesting(uses_temporary_zoom, zoom_level);
@@ -547,9 +580,8 @@
 }
 
 TEST_F(RenderViewImplScaleFactorTest, TapDisambiguatorSize) {
-  DoSetUp();
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kEnableUseZoomForDSF);
+  // TODO(oshima): This test tried in the past to enable UseZoomForDSF but
+  // didn't actually do so for the compositor, and fails with it enabled.
   const float device_scale = 2.625f;
   SetDeviceScaleFactor(device_scale);
   EXPECT_EQ(device_scale, view()->GetDeviceScaleFactor());
@@ -831,14 +863,13 @@
 // continues to receive the original ScreenInfo and not the emualted
 // ScreenInfo.
 TEST_F(RenderViewImplScaleFactorTest, DeviceEmulationWithOOPIF) {
-  DoSetUp();
-
   // This test should only run with --site-per-process.
   if (!AreAllSitesIsolatedForTesting())
     return;
 
   const float device_scale = 2.0f;
-  float compositor_dsf = IsUseZoomForDSFEnabled() ? 1.f : device_scale;
+  float compositor_dsf =
+      compositor_deps_->IsUseZoomForDSFEnabled() ? 1.f : device_scale;
   SetDeviceScaleFactor(device_scale);
 
   LoadHTML(
@@ -929,11 +960,7 @@
 // a new tab looks fine, but visiting the second web page renders smaller DOM
 // elements. We can solve this by updating DSF after swapping in the main frame.
 // See crbug.com/737777#c37.
-TEST_F(RenderViewImplScaleFactorTest, UpdateDSFAfterSwapIn) {
-  DoSetUp();
-  // The bug reproduces if zoom is used for devices scale factor.
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kEnableUseZoomForDSF);
+TEST_F(RenderViewImplEnableZoomForDSFTest, UpdateDSFAfterSwapIn) {
   const float device_scale = 3.0f;
   SetDeviceScaleFactor(device_scale);
   EXPECT_EQ(device_scale, view()->GetDeviceScaleFactor());
@@ -1050,11 +1077,8 @@
 // Verify that the renderer process doesn't crash when device scale factor
 // changes after a cross-process navigation has commited.
 // See https://crbug.com/571603.
-TEST_F(RenderViewImplTest, SetZoomLevelAfterCrossProcessNavigation) {
-  // The bug reproduces if zoom is used for devices scale factor.
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kEnableUseZoomForDSF);
-
+TEST_F(RenderViewImplEnableZoomForDSFTest,
+       SetZoomLevelAfterCrossProcessNavigation) {
   LoadHTML("Hello world!");
 
   // Swap the main frame out after which it should become a WebRemoteFrame.
@@ -2346,7 +2370,6 @@
 }
 
 TEST_F(RenderViewImplScaleFactorTest, PreferredSizeWithScaleFactor) {
-  DoSetUp();
   LoadHTML(
       "<body style='margin:0;'><div style='display:inline-block; "
       "width:400px; height:400px;'/></body>");
@@ -2557,10 +2580,8 @@
   EXPECT_TRUE(settings()->ViewportEnabled());
 }
 
-TEST_F(RenderViewImplScaleFactorTest, ConverViewportToWindowWithoutZoomForDSF) {
-  DoSetUp();
-  if (IsUseZoomForDSFEnabled())
-    return;
+TEST_F(RenderViewImplDisableZoomForDSFTest,
+       ConverViewportToWindowWithoutZoomForDSF) {
   SetDeviceScaleFactor(2.f);
   blink::WebRect rect(20, 10, 200, 100);
   view()->ConvertViewportToWindow(&rect);
@@ -2571,7 +2592,6 @@
 }
 
 TEST_F(RenderViewImplScaleFactorTest, ScreenMetricsEmulationWithOriginalDSF1) {
-  DoSetUp();
   SetDeviceScaleFactor(1.f);
 
   LoadHTML("<body style='min-height:1000px;'></body>");
@@ -2600,10 +2620,8 @@
 }
 
 TEST_F(RenderViewImplScaleFactorTest, ScreenMetricsEmulationWithOriginalDSF2) {
-  DoSetUp();
   SetDeviceScaleFactor(2.f);
-  float compositor_dsf =
-      IsUseZoomForDSFEnabled() ? 1.f : 2.f;
+  float compositor_dsf = compositor_deps_->IsUseZoomForDSFEnabled() ? 1.f : 2.f;
 
   LoadHTML("<body style='min-height:1000px;'></body>");
   {
@@ -2630,10 +2648,8 @@
   // Don't disable here to test that emulation is being shutdown properly.
 }
 
-TEST_F(RenderViewImplScaleFactorTest, ConverViewportToWindowWithZoomForDSF) {
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kEnableUseZoomForDSF);
-  DoSetUp();
+TEST_F(RenderViewImplEnableZoomForDSFTest,
+       ConverViewportToWindowWithZoomForDSF) {
   SetDeviceScaleFactor(1.f);
   {
     blink::WebRect rect(20, 10, 200, 100);
@@ -2656,11 +2672,8 @@
 }
 
 #if defined(OS_MACOSX) || defined(USE_AURA)
-TEST_F(RenderViewImplScaleFactorTest,
+TEST_F(RenderViewImplEnableZoomForDSFTest,
        DISABLED_GetCompositionCharacterBoundsTest) {  // http://crbug.com/582016
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kEnableUseZoomForDSF);
-  DoSetUp();
   SetDeviceScaleFactor(1.f);
 #if defined(OS_WIN)
   // http://crbug.com/508747
@@ -2713,10 +2726,7 @@
 
 }  // namespace
 
-TEST_F(RenderViewImplScaleFactorTest, AutoResizeWithZoomForDSF) {
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kEnableUseZoomForDSF);
-  DoSetUp();
+TEST_F(RenderViewImplEnableZoomForDSFTest, AutoResizeWithZoomForDSF) {
   view()->EnableAutoResizeForTesting(gfx::Size(5, 5), gfx::Size(1000, 1000));
   LoadHTML(kAutoResizeTestPage);
   gfx::Size size_at_1x = view()->GetWidget()->size();
@@ -2729,7 +2739,6 @@
 }
 
 TEST_F(RenderViewImplScaleFactorTest, AutoResizeWithoutZoomForDSF) {
-  DoSetUp();
   view()->EnableAutoResizeForTesting(gfx::Size(5, 5), gfx::Size(1000, 1000));
   LoadHTML(kAutoResizeTestPage);
   gfx::Size size_at_1x = view()->GetWidget()->size();
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index bd836c16..c4390b8 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -463,7 +463,7 @@
                            SetZoomLevelAfterCrossProcessNavigation);
   FRIEND_TEST_ALL_PREFIXES(RenderViewImplScaleFactorTest,
                            ConverViewportToScreenWithZoomForDSF);
-  FRIEND_TEST_ALL_PREFIXES(RenderViewImplScaleFactorTest,
+  FRIEND_TEST_ALL_PREFIXES(RenderViewImplEnableZoomForDSFTest,
                            GetCompositionCharacterBoundsTest);
 
   enum ErrorPageType {
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 247ebb4b..0a9c02c 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -4,10 +4,13 @@
 
 #include "content/renderer/render_widget.h"
 
+#include <cmath>
+#include <limits>
 #include <memory>
 #include <utility>
 
 #include "base/auto_reset.h"
+#include "base/base_switches.h"
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
@@ -17,17 +20,22 @@
 #include "base/memory/singleton.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "cc/animation/animation_host.h"
+#include "cc/base/switches.h"
 #include "cc/input/touch_action.h"
 #include "cc/trees/layer_tree_frame_sink.h"
 #include "cc/trees/layer_tree_host.h"
+#include "components/viz/common/features.h"
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
 #include "components/viz/common/frame_sinks/copy_output_request.h"
+#include "components/viz/common/switches.h"
+#include "content/common/content_switches_internal.h"
 #include "content/common/drag_event_source_info.h"
 #include "content/common/drag_messages.h"
 #include "content/common/render_frame_metadata.mojom.h"
@@ -57,6 +65,7 @@
 #include "content/renderer/input/widget_input_handler_manager.h"
 #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
 #include "content/renderer/render_frame_impl.h"
+#include "content/renderer/render_frame_metadata_observer_impl.h"
 #include "content/renderer/render_frame_proxy.h"
 #include "content/renderer/render_process.h"
 #include "content/renderer/render_thread_impl.h"
@@ -64,9 +73,11 @@
 #include "content/renderer/render_widget_owner_delegate.h"
 #include "content/renderer/renderer_blink_platform_impl.h"
 #include "content/renderer/resizing_mode_selector.h"
+#include "gpu/command_buffer/service/gpu_switches.h"
 #include "ipc/ipc_message_start.h"
 #include "ipc/ipc_sync_message.h"
 #include "ipc/ipc_sync_message_filter.h"
+#include "media/base/media_switches.h"
 #include "ppapi/buildflags/buildflags.h"
 #include "skia/ext/platform_canvas.h"
 #include "third_party/blink/public/platform/file_path_conversion.h"
@@ -96,12 +107,16 @@
 #include "third_party/skia/include/core/SkShader.h"
 #include "ui/base/clipboard/clipboard.h"
 #include "ui/base/ui_base_features.h"
+#include "ui/base/ui_base_switches.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/gfx/geometry/point_conversions.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/geometry/size_conversions.h"
 #include "ui/gfx/skia_util.h"
+#include "ui/gfx/switches.h"
 #include "ui/gl/gl_switches.h"
+#include "ui/native_theme/native_theme_features.h"
+#include "ui/native_theme/overlay_scrollbar_constants_aura.h"
 #include "ui/surface/transport_dib.h"
 
 #if defined(OS_ANDROID)
@@ -156,6 +171,9 @@
 
 namespace {
 
+const base::Feature kUnpremultiplyAndDitherLowBitDepthTiles = {
+    "UnpremultiplyAndDitherLowBitDepthTiles", base::FEATURE_ENABLED_BY_DEFAULT};
+
 typedef std::map<std::string, ui::TextInputMode> TextInputModeMap;
 
 static const int kInvalidNextPreviousFlagsValue = -1;
@@ -955,8 +973,11 @@
   mojom::RenderFrameMetadataObserverClientPtrInfo client_info;
   mojom::RenderFrameMetadataObserverClientRequest client_request =
       mojo::MakeRequest(&client_info);
-  compositor_->CreateRenderFrameObserver(std::move(request),
-                                         std::move(client_info));
+  auto render_frame_metadata_observer =
+      std::make_unique<RenderFrameMetadataObserverImpl>(std::move(request),
+                                                        std::move(client_info));
+  compositor_->SetRenderFrameObserver(
+      std::move(render_frame_metadata_observer));
   RenderThreadImpl::current()->RequestNewLayerTreeFrameSink(
       routing_id_, frame_swap_message_queue_, GetURLForGraphicsContext3D(),
       callback, std::move(client_request), std::move(ptr));
@@ -1238,7 +1259,7 @@
 }
 
 gfx::Size RenderWidget::GetSizeForWebWidget() const {
-  if (IsUseZoomForDSFEnabled()) {
+  if (compositor_deps_->IsUseZoomForDSFEnabled()) {
     return gfx::ScaleToCeiledSize(size_,
                                   GetOriginalScreenInfo().device_scale_factor);
   }
@@ -1317,7 +1338,7 @@
   ResizeWebWidget();
 
   WebSize visual_viewport_size;
-  if (IsUseZoomForDSFEnabled()) {
+  if (compositor_deps_->IsUseZoomForDSFEnabled()) {
     visual_viewport_size =
         gfx::ScaleToCeiledSize(params.visible_viewport_size,
                                GetOriginalScreenInfo().device_scale_factor);
@@ -1351,8 +1372,9 @@
 
   compositor_ =
       std::make_unique<RenderWidgetCompositor>(this, compositor_deps_);
-  compositor_->Initialize(RenderWidgetCompositor::GenerateLayerTreeSettings(
-      compositor_deps_, for_oopif_, screen_info_));
+  compositor_->Initialize(GenerateLayerTreeSettings(
+      compositor_deps_, for_oopif_, screen_info_.rect.size(),
+      screen_info_.device_scale_factor));
 
   UpdateSurfaceAndScreenInfo(local_surface_id_from_parent_,
                              compositor_viewport_pixel_size_, screen_info_);
@@ -1549,7 +1571,7 @@
       frame_widget ? frame_widget->LocalRoot() : nullptr;
   blink::WebView* webview = current_frame ? current_frame->View() : nullptr;
   if (webview) {
-    if (IsUseZoomForDSFEnabled())
+    if (compositor_deps_->IsUseZoomForDSFEnabled())
       webview->SetZoomFactorForDeviceScaleFactor(
           GetWebScreenInfo().device_scale_factor);
     else
@@ -2005,7 +2027,7 @@
 }
 
 void RenderWidget::ConvertViewportToWindow(blink::WebRect* rect) {
-  if (IsUseZoomForDSFEnabled()) {
+  if (compositor_deps_->IsUseZoomForDSFEnabled()) {
     float reverse = 1 / GetOriginalScreenInfo().device_scale_factor;
     // TODO(oshima): We may need to allow pixel precision here as the the
     // anchor element can be placed at half pixel.
@@ -2019,7 +2041,7 @@
 }
 
 void RenderWidget::ConvertWindowToViewport(blink::WebFloatRect* rect) {
-  if (IsUseZoomForDSFEnabled()) {
+  if (compositor_deps_->IsUseZoomForDSFEnabled()) {
     rect->x *= GetOriginalScreenInfo().device_scale_factor;
     rect->y *= GetOriginalScreenInfo().device_scale_factor;
     rect->width *= GetOriginalScreenInfo().device_scale_factor;
@@ -2356,6 +2378,431 @@
                                          position, velocity, behavior);
 }
 
+// static
+cc::LayerTreeSettings RenderWidget::GenerateLayerTreeSettings(
+    CompositorDependencies* compositor_deps,
+    bool is_for_subframe,
+    const gfx::Size& initial_screen_size,
+    float initial_device_scale_factor) {
+  const bool is_threaded =
+      !!compositor_deps->GetCompositorImplThreadTaskRunner();
+
+  const base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess();
+  cc::LayerTreeSettings settings;
+
+  settings.resource_settings.use_r16_texture =
+      base::FeatureList::IsEnabled(media::kUseR16Texture);
+
+  settings.commit_to_active_tree = !is_threaded;
+  settings.is_layer_tree_for_subframe = is_for_subframe;
+
+  // For web contents, layer transforms should scale up the contents of layers
+  // to keep content always crisp when possible.
+  settings.layer_transforms_should_scale_layer_contents = true;
+
+  settings.main_frame_before_activation_enabled =
+      cmd.HasSwitch(cc::switches::kEnableMainFrameBeforeActivation);
+
+  // Checkerimaging is not supported for synchronous single-threaded mode, which
+  // is what the renderer uses if its not threaded.
+  settings.enable_checker_imaging =
+      !cmd.HasSwitch(cc::switches::kDisableCheckerImaging) && is_threaded;
+
+#if defined(OS_ANDROID)
+  // We can use a more aggressive limit on Android since decodes tend to take
+  // longer on these devices.
+  settings.min_image_bytes_to_checker = 512 * 1024;  // 512kB
+
+  // Re-rasterization of checker-imaged content with software raster can be too
+  // costly on Android.
+  settings.only_checker_images_with_gpu_raster = true;
+#endif
+
+  auto switch_value_as_int = [](const base::CommandLine& command_line,
+                                const std::string& switch_string, int min_value,
+                                int max_value, int* result) {
+    std::string string_value = command_line.GetSwitchValueASCII(switch_string);
+    int int_value;
+    if (base::StringToInt(string_value, &int_value) && int_value >= min_value &&
+        int_value <= max_value) {
+      *result = int_value;
+      return true;
+    } else {
+      LOG(WARNING) << "Failed to parse switch " << switch_string << ": "
+                   << string_value;
+      return false;
+    }
+  };
+
+  int default_tile_size = 256;
+#if defined(OS_ANDROID)
+  const gfx::Size screen_size =
+      gfx::ScaleToFlooredSize(initial_screen_size, initial_device_scale_factor);
+  int display_width = screen_size.width();
+  int display_height = screen_size.height();
+  int numTiles = (display_width * display_height) / (256 * 256);
+  if (numTiles > 16)
+    default_tile_size = 384;
+  if (numTiles >= 40)
+    default_tile_size = 512;
+
+  // Adjust for some resolutions that barely straddle an extra
+  // tile when in portrait mode. This helps worst case scroll/raster
+  // by not needing a full extra tile for each row.
+  constexpr int tolerance = 10;  // To avoid rounding errors.
+  int portrait_width = std::min(display_width, display_height);
+  if (default_tile_size == 256 && std::abs(portrait_width - 768) < tolerance)
+    default_tile_size += 32;
+  if (default_tile_size == 384 && std::abs(portrait_width - 1200) < tolerance)
+    default_tile_size += 32;
+#elif defined(OS_CHROMEOS) || defined(OS_MACOSX)
+  // Use 512 for high DPI (dsf=2.0f) devices.
+  if (initial_device_scale_factor >= 2.0f)
+    default_tile_size = 512;
+#endif
+
+  // TODO(danakj): This should not be a setting O_O; it should change when the
+  // device scale factor on LayerTreeHost changes.
+  settings.default_tile_size = gfx::Size(default_tile_size, default_tile_size);
+  if (cmd.HasSwitch(switches::kDefaultTileWidth)) {
+    int tile_width = 0;
+    switch_value_as_int(cmd, switches::kDefaultTileWidth, 1,
+                        std::numeric_limits<int>::max(), &tile_width);
+    settings.default_tile_size.set_width(tile_width);
+  }
+  if (cmd.HasSwitch(switches::kDefaultTileHeight)) {
+    int tile_height = 0;
+    switch_value_as_int(cmd, switches::kDefaultTileHeight, 1,
+                        std::numeric_limits<int>::max(), &tile_height);
+    settings.default_tile_size.set_height(tile_height);
+  }
+
+  int max_untiled_layer_width = settings.max_untiled_layer_size.width();
+  if (cmd.HasSwitch(switches::kMaxUntiledLayerWidth)) {
+    switch_value_as_int(cmd, switches::kMaxUntiledLayerWidth, 1,
+                        std::numeric_limits<int>::max(),
+                        &max_untiled_layer_width);
+  }
+  int max_untiled_layer_height = settings.max_untiled_layer_size.height();
+  if (cmd.HasSwitch(switches::kMaxUntiledLayerHeight)) {
+    switch_value_as_int(cmd, switches::kMaxUntiledLayerHeight, 1,
+                        std::numeric_limits<int>::max(),
+                        &max_untiled_layer_height);
+  }
+
+  settings.max_untiled_layer_size =
+      gfx::Size(max_untiled_layer_width, max_untiled_layer_height);
+
+  settings.gpu_rasterization_msaa_sample_count =
+      compositor_deps->GetGpuRasterizationMSAASampleCount();
+  settings.gpu_rasterization_forced =
+      compositor_deps->IsGpuRasterizationForced();
+
+  settings.can_use_lcd_text = compositor_deps->IsLcdTextEnabled();
+  settings.use_zero_copy = compositor_deps->IsZeroCopyEnabled();
+  settings.use_partial_raster = compositor_deps->IsPartialRasterEnabled();
+  settings.enable_elastic_overscroll =
+      compositor_deps->IsElasticOverscrollEnabled();
+  settings.resource_settings.use_gpu_memory_buffer_resources =
+      compositor_deps->IsGpuMemoryBufferCompositorResourcesEnabled();
+  settings.use_painted_device_scale_factor =
+      compositor_deps->IsUseZoomForDSFEnabled();
+
+  // Build LayerTreeSettings from command line args.
+  if (cmd.HasSwitch(cc::switches::kBrowserControlsShowThreshold)) {
+    std::string top_threshold_str =
+        cmd.GetSwitchValueASCII(cc::switches::kBrowserControlsShowThreshold);
+    double show_threshold;
+    if (base::StringToDouble(top_threshold_str, &show_threshold) &&
+        show_threshold >= 0.f && show_threshold <= 1.f)
+      settings.top_controls_show_threshold = show_threshold;
+  }
+
+  if (cmd.HasSwitch(cc::switches::kBrowserControlsHideThreshold)) {
+    std::string top_threshold_str =
+        cmd.GetSwitchValueASCII(cc::switches::kBrowserControlsHideThreshold);
+    double hide_threshold;
+    if (base::StringToDouble(top_threshold_str, &hide_threshold) &&
+        hide_threshold >= 0.f && hide_threshold <= 1.f)
+      settings.top_controls_hide_threshold = hide_threshold;
+  }
+
+  settings.use_layer_lists = cmd.HasSwitch(cc::switches::kEnableLayerLists);
+
+  // The means the renderer compositor has 2 possible modes:
+  // - Threaded compositing with a scheduler.
+  // - Single threaded compositing without a scheduler (for layout tests only).
+  // Using the scheduler in layout tests introduces additional composite steps
+  // that create flakiness.
+  settings.single_thread_proxy_scheduler = false;
+
+  // These flags should be mirrored by UI versions in ui/compositor/.
+  if (cmd.HasSwitch(cc::switches::kShowCompositedLayerBorders))
+    settings.initial_debug_state.show_debug_borders.set();
+  settings.initial_debug_state.show_layer_animation_bounds_rects =
+      cmd.HasSwitch(cc::switches::kShowLayerAnimationBounds);
+  settings.initial_debug_state.show_paint_rects =
+      cmd.HasSwitch(switches::kShowPaintRects);
+  settings.initial_debug_state.show_property_changed_rects =
+      cmd.HasSwitch(cc::switches::kShowPropertyChangedRects);
+  settings.initial_debug_state.show_surface_damage_rects =
+      cmd.HasSwitch(cc::switches::kShowSurfaceDamageRects);
+  settings.initial_debug_state.show_screen_space_rects =
+      cmd.HasSwitch(cc::switches::kShowScreenSpaceRects);
+
+  settings.initial_debug_state.SetRecordRenderingStats(
+      cmd.HasSwitch(cc::switches::kEnableGpuBenchmarking));
+  settings.enable_surface_synchronization =
+      features::IsSurfaceSynchronizationEnabled();
+  settings.build_hit_test_data = features::IsVizHitTestingSurfaceLayerEnabled();
+
+  if (cmd.HasSwitch(cc::switches::kSlowDownRasterScaleFactor)) {
+    const int kMinSlowDownScaleFactor = 0;
+    const int kMaxSlowDownScaleFactor = INT_MAX;
+    switch_value_as_int(
+        cmd, cc::switches::kSlowDownRasterScaleFactor, kMinSlowDownScaleFactor,
+        kMaxSlowDownScaleFactor,
+        &settings.initial_debug_state.slow_down_raster_scale_factor);
+  }
+
+  // This is default overlay scrollbar settings for Android and DevTools mobile
+  // emulator. Aura Overlay Scrollbar will override below.
+  settings.scrollbar_animator = cc::LayerTreeSettings::ANDROID_OVERLAY;
+  settings.solid_color_scrollbar_color = SkColorSetARGB(128, 128, 128, 128);
+  settings.scrollbar_fade_delay = base::TimeDelta::FromMilliseconds(300);
+  settings.scrollbar_fade_duration = base::TimeDelta::FromMilliseconds(300);
+
+#if defined(OS_ANDROID)
+  bool using_synchronous_compositor =
+      compositor_deps->UsingSynchronousCompositing();
+  bool using_low_memory_policy = base::SysInfo::IsLowEndDevice();
+
+  settings.use_stream_video_draw_quad = true;
+  settings.using_synchronous_renderer_compositor = using_synchronous_compositor;
+  if (using_synchronous_compositor) {
+    // Android WebView uses system scrollbars, so make ours invisible.
+    // http://crbug.com/677348: This can't be done using hide_scrollbars
+    // setting because supporting -webkit custom scrollbars is still desired
+    // on sublayers.
+    settings.scrollbar_animator = cc::LayerTreeSettings::NO_ANIMATOR;
+    settings.solid_color_scrollbar_color = SK_ColorTRANSPARENT;
+
+    settings.enable_early_damage_check =
+        cmd.HasSwitch(cc::switches::kCheckDamageEarly);
+  }
+  // Android WebView handles root layer flings itself.
+  settings.ignore_root_layer_flings = using_synchronous_compositor;
+  // Memory policy on Android WebView does not depend on whether device is
+  // low end, so always use default policy.
+  if (using_low_memory_policy && !using_synchronous_compositor) {
+    // On low-end we want to be very carefull about killing other
+    // apps. So initially we use 50% more memory to avoid flickering
+    // or raster-on-demand.
+    settings.max_memory_for_prepaint_percentage = 67;
+  } else {
+    // On other devices we have increased memory excessively to avoid
+    // raster-on-demand already, so now we reserve 50% _only_ to avoid
+    // raster-on-demand, and use 50% of the memory otherwise.
+    settings.max_memory_for_prepaint_percentage = 50;
+  }
+
+  // TODO(danakj): Only do this on low end devices.
+  settings.create_low_res_tiling = true;
+
+#else   // defined(OS_ANDROID)
+  bool using_synchronous_compositor = false;  // Only for Android WebView.
+  // On desktop, we never use the low memory policy unless we are simulating
+  // low-end mode via a switch.
+  bool using_low_memory_policy =
+      cmd.HasSwitch(switches::kEnableLowEndDeviceMode);
+
+  if (ui::IsOverlayScrollbarEnabled()) {
+    settings.scrollbar_animator = cc::LayerTreeSettings::AURA_OVERLAY;
+    settings.scrollbar_fade_delay = ui::kOverlayScrollbarFadeDelay;
+    settings.scrollbar_fade_duration = ui::kOverlayScrollbarFadeDuration;
+    settings.scrollbar_thinning_duration =
+        ui::kOverlayScrollbarThinningDuration;
+    settings.scrollbar_flash_after_any_scroll_update =
+        ui::OverlayScrollbarFlashAfterAnyScrollUpdate();
+    settings.scrollbar_flash_when_mouse_enter =
+        ui::OverlayScrollbarFlashWhenMouseEnter();
+  }
+
+  // On desktop, if there's over 4GB of memory on the machine, increase the
+  // working set size to 256MB for both gpu and software.
+  const int kImageDecodeMemoryThresholdMB = 4 * 1024;
+  if (base::SysInfo::AmountOfPhysicalMemoryMB() >=
+      kImageDecodeMemoryThresholdMB) {
+    settings.decoded_image_working_set_budget_bytes = 256 * 1024 * 1024;
+  } else {
+    // This is the default, but recorded here as well.
+    settings.decoded_image_working_set_budget_bytes = 128 * 1024 * 1024;
+  }
+#endif  // defined(OS_ANDROID)
+
+  if (using_low_memory_policy) {
+    // RGBA_4444 textures are only enabled:
+    //  - If the user hasn't explicitly disabled them
+    //  - If system ram is <= 512MB (1GB devices are sometimes low-end).
+    //  - If we are not running in a WebView, where 4444 isn't supported.
+    if (!cmd.HasSwitch(switches::kDisableRGBA4444Textures) &&
+        base::SysInfo::AmountOfPhysicalMemoryMB() <= 512 &&
+        !using_synchronous_compositor) {
+      settings.use_rgba_4444 = viz::RGBA_4444;
+
+      // If we are going to unpremultiply and dither these tiles, we need to
+      // allocate an additional RGBA_8888 intermediate for each tile
+      // rasterization when rastering to RGBA_4444 to allow for dithering.
+      // Setting a reasonable sized max tile size allows this intermediate to
+      // be consistently reused.
+      if (base::FeatureList::IsEnabled(
+              kUnpremultiplyAndDitherLowBitDepthTiles)) {
+        settings.max_gpu_raster_tile_size = gfx::Size(512, 256);
+        settings.unpremultiply_and_dither_low_bit_depth_tiles = true;
+      }
+    }
+  }
+
+  if (cmd.HasSwitch(switches::kEnableLowResTiling))
+    settings.create_low_res_tiling = true;
+  if (cmd.HasSwitch(switches::kDisableLowResTiling))
+    settings.create_low_res_tiling = false;
+
+  if (cmd.HasSwitch(switches::kEnableRGBA4444Textures) &&
+      !cmd.HasSwitch(switches::kDisableRGBA4444Textures)) {
+    settings.use_rgba_4444 = true;
+  }
+
+  settings.max_staging_buffer_usage_in_bytes = 32 * 1024 * 1024;  // 32MB
+  // Use 1/4th of staging buffers on low-end devices.
+  if (base::SysInfo::IsLowEndDevice())
+    settings.max_staging_buffer_usage_in_bytes /= 4;
+
+  cc::ManagedMemoryPolicy defaults = settings.memory_policy;
+  settings.memory_policy = GetGpuMemoryPolicy(defaults, initial_screen_size,
+                                              initial_device_scale_factor);
+
+  settings.disallow_non_exact_resource_reuse =
+      cmd.HasSwitch(switches::kDisallowNonExactResourceReuse);
+#if defined(OS_ANDROID)
+  // TODO(crbug.com/746931): This feature appears to be causing visual
+  // corruption on certain android devices. Will investigate and re-enable.
+  settings.disallow_non_exact_resource_reuse = true;
+#endif
+
+  if (cmd.HasSwitch(switches::kRunAllCompositorStagesBeforeDraw)) {
+    settings.wait_for_all_pipeline_stages_before_draw = true;
+    settings.enable_latency_recovery = false;
+  }
+
+  settings.enable_image_animation_resync =
+      !cmd.HasSwitch(switches::kDisableImageAnimationResync);
+
+  settings.always_request_presentation_time =
+      cmd.HasSwitch(cc::switches::kAlwaysRequestPresentationTime);
+  return settings;
+}
+
+// static
+cc::ManagedMemoryPolicy RenderWidget::GetGpuMemoryPolicy(
+    const cc::ManagedMemoryPolicy& default_policy,
+    const gfx::Size& initial_screen_size,
+    float initial_device_scale_factor) {
+  cc::ManagedMemoryPolicy actual = default_policy;
+  actual.bytes_limit_when_visible = 0;
+
+  // If the value was overridden on the command line, use the specified value.
+  static bool client_hard_limit_bytes_overridden =
+      base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kForceGpuMemAvailableMb);
+  if (client_hard_limit_bytes_overridden) {
+    if (base::StringToSizeT(
+            base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+                switches::kForceGpuMemAvailableMb),
+            &actual.bytes_limit_when_visible))
+      actual.bytes_limit_when_visible *= 1024 * 1024;
+    return actual;
+  }
+
+#if defined(OS_ANDROID)
+  // We can't query available GPU memory from the system on Android.
+  // Physical memory is also mis-reported sometimes (eg. Nexus 10 reports
+  // 1262MB when it actually has 2GB, while Razr M has 1GB but only reports
+  // 128MB java heap size). First we estimate physical memory using both.
+  size_t dalvik_mb = base::SysInfo::DalvikHeapSizeMB();
+  size_t physical_mb = base::SysInfo::AmountOfPhysicalMemoryMB();
+  size_t physical_memory_mb = 0;
+  if (base::SysInfo::IsLowEndDevice()) {
+    // TODO(crbug.com/742534): The code below appears to no longer work.
+    // |dalvik_mb| no longer follows the expected heuristic pattern, causing us
+    // to over-estimate memory on low-end devices. This entire section probably
+    // needs to be re-written, but for now we can address the low-end Android
+    // issues by ignoring |dalvik_mb|.
+    physical_memory_mb = physical_mb;
+  } else if (dalvik_mb >= 256) {
+    physical_memory_mb = dalvik_mb * 4;
+  } else {
+    physical_memory_mb = std::max(dalvik_mb * 4, (physical_mb * 4) / 3);
+  }
+
+  // Now we take a default of 1/8th of memory on high-memory devices,
+  // and gradually scale that back for low-memory devices (to be nicer
+  // to other apps so they don't get killed). Examples:
+  // Nexus 4/10(2GB)    256MB (normally 128MB)
+  // Droid Razr M(1GB)  114MB (normally 57MB)
+  // Galaxy Nexus(1GB)  100MB (normally 50MB)
+  // Xoom(1GB)          100MB (normally 50MB)
+  // Nexus S(low-end)   8MB (normally 8MB)
+  // Note that the compositor now uses only some of this memory for
+  // pre-painting and uses the rest only for 'emergencies'.
+  if (actual.bytes_limit_when_visible == 0) {
+    // NOTE: Non-low-end devices use only 50% of these limits,
+    // except during 'emergencies' where 100% can be used.
+    if (physical_memory_mb >= 1536)
+      actual.bytes_limit_when_visible = physical_memory_mb / 8;  // >192MB
+    else if (physical_memory_mb >= 1152)
+      actual.bytes_limit_when_visible = physical_memory_mb / 8;  // >144MB
+    else if (physical_memory_mb >= 768)
+      actual.bytes_limit_when_visible = physical_memory_mb / 10;  // >76MB
+    else if (physical_memory_mb >= 513)
+      actual.bytes_limit_when_visible = physical_memory_mb / 12;  // <64MB
+    else
+      // Devices with this little RAM have very little headroom so we hardcode
+      // the limit rather than relying on the heuristics above.  (They also use
+      // 4444 textures so we can use a lower limit.)
+      actual.bytes_limit_when_visible = 8;
+
+    actual.bytes_limit_when_visible =
+        actual.bytes_limit_when_visible * 1024 * 1024;
+    // Clamp the observed value to a specific range on Android.
+    actual.bytes_limit_when_visible = std::max(
+        actual.bytes_limit_when_visible, static_cast<size_t>(8 * 1024 * 1024));
+    actual.bytes_limit_when_visible =
+        std::min(actual.bytes_limit_when_visible,
+                 static_cast<size_t>(256 * 1024 * 1024));
+  }
+  actual.priority_cutoff_when_visible =
+      gpu::MemoryAllocation::CUTOFF_ALLOW_EVERYTHING;
+#else
+  // Ignore what the system said and give all clients the same maximum
+  // allocation on desktop platforms.
+  actual.bytes_limit_when_visible = 512 * 1024 * 1024;
+  actual.priority_cutoff_when_visible =
+      gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE;
+
+  // For large monitors (4k), double the tile memory to avoid frequent out of
+  // memory problems. 4k could mean a screen width of anywhere from 3840 to 4096
+  // (see https://en.wikipedia.org/wiki/4K_resolution). We use 3500 as a proxy
+  // for "large enough".
+  static const int kLargeDisplayThreshold = 3500;
+  int display_width =
+      std::round(initial_screen_size.width() * initial_device_scale_factor);
+  if (display_width >= kLargeDisplayThreshold)
+    actual.bytes_limit_when_visible *= 2;
+#endif
+  return actual;
+}
+
 void RenderWidget::StartCompositor() {
   if (!is_hidden())
     compositor_->SetVisible(true);
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index c89b02e..9a1cfa0 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -26,6 +26,8 @@
 #include "build/build_config.h"
 #include "cc/input/overscroll_behavior.h"
 #include "cc/input/touch_action.h"
+#include "cc/trees/layer_tree_settings.h"
+#include "cc/trees/managed_memory_policy.h"
 #include "components/viz/common/surfaces/local_surface_id.h"
 #include "content/common/buildflags.h"
 #include "content/common/content_export.h"
@@ -338,6 +340,20 @@
   // position.
   virtual ui::TextInputType GetTextInputType();
 
+  // Internal helper that generates the LayerTreeSettings to be given to the
+  // compositor in StartCompositor().
+  static cc::LayerTreeSettings GenerateLayerTreeSettings(
+      CompositorDependencies* compositor_deps,
+      bool is_for_subframe,
+      const gfx::Size& initial_screen_size,
+      float initial_device_scale_factor);
+  // Internal helper that generates the ManagedMemoryPolicy to be given to the
+  // compositor in StartCompositor().
+  static cc::ManagedMemoryPolicy GetGpuMemoryPolicy(
+      const cc::ManagedMemoryPolicy& policy,
+      const gfx::Size& initial_screen_size,
+      float initial_device_scale_factor);
+
   // Begins the compositor's scheduler to start producing frames.
   void StartCompositor();
 
diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc
index 72662c74..83ae127 100644
--- a/content/renderer/render_widget_fullscreen_pepper.cc
+++ b/content/renderer/render_widget_fullscreen_pepper.cc
@@ -391,7 +391,7 @@
   if (!layer_)
     return;
 
-  if (IsUseZoomForDSFEnabled()) {
+  if (compositor_deps()->IsUseZoomForDSFEnabled()) {
     // Note that root cc::Layers' bounds are specified in pixels (in contrast
     // with non-root cc::Layers' bounds, which are specified in DIPs).
     layer_->SetBounds(blink::WebSize(compositor_viewport_pixel_size()));
diff --git a/content/renderer/render_widget_unittest.cc b/content/renderer/render_widget_unittest.cc
index 319ab3c..242054e 100644
--- a/content/renderer/render_widget_unittest.cc
+++ b/content/renderer/render_widget_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/run_loop.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_task_environment.h"
+#include "build/build_config.h"
 #include "components/viz/common/features.h"
 #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
 #include "content/common/input/input_handler.mojom.h"
@@ -520,4 +521,29 @@
   EXPECT_EQ(popup_emulated_rect.y, widget()->ViewRect().y);
 }
 
+// Verify desktop memory limit calculations.
+#if !defined(OS_ANDROID)
+TEST(RenderWidgetTest, IgnoreGivenMemoryPolicy) {
+  auto policy = RenderWidget::GetGpuMemoryPolicy(cc::ManagedMemoryPolicy(256),
+                                                 gfx::Size(), 1.f);
+  EXPECT_EQ(512u * 1024u * 1024u, policy.bytes_limit_when_visible);
+  EXPECT_EQ(gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
+            policy.priority_cutoff_when_visible);
+}
+
+TEST(RenderWidgetTest, LargeScreensUseMoreMemory) {
+  auto policy = RenderWidget::GetGpuMemoryPolicy(cc::ManagedMemoryPolicy(256),
+                                                 gfx::Size(4096, 2160), 1.f);
+  EXPECT_EQ(2u * 512u * 1024u * 1024u, policy.bytes_limit_when_visible);
+  EXPECT_EQ(gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
+            policy.priority_cutoff_when_visible);
+
+  policy = RenderWidget::GetGpuMemoryPolicy(cc::ManagedMemoryPolicy(256),
+                                            gfx::Size(2048, 1080), 2.f);
+  EXPECT_EQ(2u * 512u * 1024u * 1024u, policy.bytes_limit_when_visible);
+  EXPECT_EQ(gpu::MemoryAllocation::CUTOFF_ALLOW_NICE_TO_HAVE,
+            policy.priority_cutoff_when_visible);
+}
+#endif  // !defined(OS_ANDROID)
+
 }  // namespace content
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 59cafc6..64a2754f 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -691,12 +691,6 @@
   is_locked_to_site_ = true;
 }
 
-bool RendererBlinkPlatformImpl::IsThreadedCompositingEnabled() {
-  RenderThreadImpl* thread = RenderThreadImpl::current();
-  // thread can be NULL in tests.
-  return thread && thread->compositor_task_runner().get();
-}
-
 bool RendererBlinkPlatformImpl::IsGpuCompositingDisabled() {
   DCHECK_CALLED_ON_VALID_THREAD(main_thread_checker_);
   RenderThreadImpl* thread = RenderThreadImpl::current();
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index a068ebb9..11a3acd6 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -131,7 +131,6 @@
   blink::WebString FileSystemCreateOriginIdentifier(
       const blink::WebSecurityOrigin& origin) override;
 
-  bool IsThreadedCompositingEnabled() override;
   bool IsThreadedAnimationEnabled() override;
   bool IsGpuCompositingDisabled() override;
   double AudioHardwareSampleRate() override;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 10e7cf3..df8913e 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -338,7 +338,7 @@
     "//media",
     "//media/capture",
     "//media/capture/mojom:image_capture",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net:test_support",
     "//services/audio/public/mojom",
     "//services/device/public/mojom",
@@ -933,7 +933,7 @@
     "//ipc",
     "//ipc:test_support",
     "//media:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//net:test_support",
     "//ppapi/buildflags",
@@ -1811,7 +1811,7 @@
     "//media/capture",
     "//media/midi:midi",
     "//media/midi:mojo",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/test_support:test_utils",
     "//net:extras",
diff --git a/content/test/fake_compositor_dependencies.cc b/content/test/fake_compositor_dependencies.cc
index 60a870f5..c56026d 100644
--- a/content/test/fake_compositor_dependencies.cc
+++ b/content/test/fake_compositor_dependencies.cc
@@ -48,6 +48,10 @@
   return true;
 }
 
+bool FakeCompositorDependencies::IsUseZoomForDSFEnabled() {
+  return use_zoom_for_dsf_;
+}
+
 scoped_refptr<base::SingleThreadTaskRunner>
 FakeCompositorDependencies::GetCompositorMainThreadTaskRunner() {
   return base::ThreadTaskRunnerHandle::Get();
@@ -67,10 +71,6 @@
   return &task_graph_runner_;
 }
 
-bool FakeCompositorDependencies::IsThreadedAnimationEnabled() {
-  return true;
-}
-
 bool FakeCompositorDependencies::IsScrollAnimatorEnabled() {
   return false;
 }
@@ -80,4 +80,10 @@
   return std::make_unique<cc::TestUkmRecorderFactory>();
 }
 
+#ifdef OS_ANDROID
+bool FakeCompositorDependencies::UsingSynchronousCompositing() {
+  return false;
+}
+#endif
+
 }  // namespace content
diff --git a/content/test/fake_compositor_dependencies.h b/content/test/fake_compositor_dependencies.h
index c097c950..0366f06 100644
--- a/content/test/fake_compositor_dependencies.h
+++ b/content/test/fake_compositor_dependencies.h
@@ -26,19 +26,27 @@
   bool IsPartialRasterEnabled() override;
   bool IsGpuMemoryBufferCompositorResourcesEnabled() override;
   bool IsElasticOverscrollEnabled() override;
+  bool IsUseZoomForDSFEnabled() override;
   scoped_refptr<base::SingleThreadTaskRunner>
   GetCompositorMainThreadTaskRunner() override;
   scoped_refptr<base::SingleThreadTaskRunner>
   GetCompositorImplThreadTaskRunner() override;
   blink::scheduler::WebThreadScheduler* GetWebMainThreadScheduler() override;
   cc::TaskGraphRunner* GetTaskGraphRunner() override;
-  bool IsThreadedAnimationEnabled() override;
   bool IsScrollAnimatorEnabled() override;
   std::unique_ptr<cc::UkmRecorderFactory> CreateUkmRecorderFactory() override;
+#ifdef OS_ANDROID
+  bool UsingSynchronousCompositing() override;
+#endif
+
+  void set_use_zoom_for_dsf_enabled(bool enabled) {
+    use_zoom_for_dsf_ = enabled;
+  }
 
  private:
   cc::TestTaskGraphRunner task_graph_runner_;
   blink::scheduler::FakeRendererScheduler renderer_scheduler_;
+  bool use_zoom_for_dsf_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(FakeCompositorDependencies);
 };
diff --git a/content/test/test_blink_web_unit_test_support.cc b/content/test/test_blink_web_unit_test_support.cc
index c2a9ad9..816ea43 100644
--- a/content/test/test_blink_web_unit_test_support.cc
+++ b/content/test/test_blink_web_unit_test_support.cc
@@ -123,6 +123,8 @@
 #endif
 #endif
 
+content::TestBlinkWebUnitTestSupport* g_test_platform = nullptr;
+
 }  // namespace
 
 namespace content {
@@ -179,6 +181,7 @@
 
   service_manager::BinderRegistry empty_registry;
   blink::Initialize(this, &empty_registry);
+  g_test_platform = this;
   blink::SetLayoutTestMode(true);
   blink::WebRuntimeFeatures::EnableDatabase(true);
   blink::WebRuntimeFeatures::EnableNotifications(true);
@@ -208,6 +211,7 @@
   mock_clipboard_host_.reset();
   if (main_thread_scheduler_)
     main_thread_scheduler_->Shutdown();
+  g_test_platform = nullptr;
 }
 
 blink::WebBlobRegistry* TestBlinkWebUnitTestSupport::GetBlobRegistry() {
@@ -311,6 +315,10 @@
   return BlinkPlatformImpl::CurrentThread();
 }
 
+bool TestBlinkWebUnitTestSupport::IsThreadedAnimationEnabled() {
+  return threaded_animation_;
+}
+
 namespace {
 
 class TestWebRTCCertificateGenerator
@@ -364,4 +372,13 @@
       blink::mojom::ClipboardHostRequest(std::move(handle)));
 }
 
+// static
+bool TestBlinkWebUnitTestSupport::SetThreadedAnimationEnabled(bool enabled) {
+  DCHECK(g_test_platform)
+      << "Not using TestBlinkWebUnitTestSupport as blink::Platform";
+  bool old = g_test_platform->threaded_animation_;
+  g_test_platform->threaded_animation_ = enabled;
+  return old;
+}
+
 }  // namespace content
diff --git a/content/test/test_blink_web_unit_test_support.h b/content/test/test_blink_web_unit_test_support.h
index 485d6a80..ab71962 100644
--- a/content/test/test_blink_web_unit_test_support.h
+++ b/content/test/test_blink_web_unit_test_support.h
@@ -60,12 +60,21 @@
 
   blink::WebThread* CurrentThread() override;
 
+  bool IsThreadedAnimationEnabled() override;
+
   std::unique_ptr<blink::WebRTCCertificateGenerator>
   CreateRTCCertificateGenerator() override;
 
   service_manager::Connector* GetConnector() override;
   blink::InterfaceProvider* GetInterfaceProvider() override;
 
+  // May be called when |this| is registered as the active blink Platform
+  // implementation. Overrides the result of IsThreadedAnimationEnabled() to
+  // the provided value, and returns the value it was set to before the call.
+  // The original value should be restored before ending a test to avoid
+  // cross-test side effects.
+  static bool SetThreadedAnimationEnabled(bool enabled);
+
  private:
   void BindClipboardHost(mojo::ScopedMessagePipeHandle handle);
 
@@ -77,6 +86,7 @@
   std::unique_ptr<blink::WebURLLoaderMockFactory> url_loader_factory_;
   std::unique_ptr<blink::scheduler::WebThreadScheduler> main_thread_scheduler_;
   std::unique_ptr<blink::WebThread> web_thread_;
+  bool threaded_animation_ = true;
 
   base::WeakPtrFactory<TestBlinkWebUnitTestSupport> weak_factory_;
 
diff --git a/device/BUILD.gn b/device/BUILD.gn
index a71979c5..1c0f140 100644
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -114,7 +114,7 @@
     "//device/gamepad/public/cpp:shared_with_blink",
     "//device/gamepad/public/mojom",
     "//device/gamepad/public/mojom:gamepad_mojom_traits_test",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//net",
     "//testing/gmock",
diff --git a/device/test/DEPS b/device/test/DEPS
index 925de5e9..4e59ade 100644
--- a/device/test/DEPS
+++ b/device/test/DEPS
@@ -1,5 +1,5 @@
 include_rules = [
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+net/base",
   "+net/proxy_resolution",
   "+net/traffic_annotation",
diff --git a/device/test/run_all_unittests.cc b/device/test/run_all_unittests.cc
index 952e28b5..0697312 100644
--- a/device/test/run_all_unittests.cc
+++ b/device/test/run_all_unittests.cc
@@ -6,12 +6,12 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   base::TestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
   return base::LaunchUnitTests(
       argc,
       argv,
diff --git a/google_apis/BUILD.gn b/google_apis/BUILD.gn
index f679a5b..d0d54b6b0 100644
--- a/google_apis/BUILD.gn
+++ b/google_apis/BUILD.gn
@@ -257,7 +257,7 @@
     ":test_support",
     "//base",
     "//base/test:run_all_unittests",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/google_apis/gaia/DEPS b/google_apis/gaia/DEPS
index d311b384..e2946d8 100644
--- a/google_apis/gaia/DEPS
+++ b/google_apis/gaia/DEPS
@@ -10,6 +10,6 @@
   r"|oauth2_token_service_unittest\.cc"
   r")": [
     "+services/network/test/test_url_loader_factory.h",
-    "+mojo/edk",
+    "+mojo/core/embedder",
   ],
 }
\ No newline at end of file
diff --git a/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc b/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc
index 4c9c8e71..10c59b8e 100644
--- a/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc
+++ b/google_apis/gaia/oauth2_access_token_fetcher_impl_unittest.cc
@@ -14,7 +14,7 @@
 #include "google_apis/gaia/gaia_urls.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "google_apis/gaia/oauth2_access_token_consumer.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "net/base/net_errors.h"
 #include "net/http/http_status_code.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
@@ -80,7 +80,7 @@
     url_loader_factory_.SetInterceptor(base::BindRepeating(
         &URLLoaderFactoryInterceptor::Intercept,
         base::Unretained(&url_loader_factory_interceptor_)));
-    mojo::edk::Init();
+    mojo::core::Init();
     base::RunLoop().RunUntilIdle();
   }
 
diff --git a/google_apis/gaia/oauth2_token_service_unittest.cc b/google_apis/gaia/oauth2_token_service_unittest.cc
index 0c73d1b..fc32dea 100644
--- a/google_apis/gaia/oauth2_token_service_unittest.cc
+++ b/google_apis/gaia/oauth2_token_service_unittest.cc
@@ -17,7 +17,7 @@
 #include "google_apis/gaia/oauth2_access_token_fetcher_impl.h"
 #include "google_apis/gaia/oauth2_token_service.h"
 #include "google_apis/gaia/oauth2_token_service_test_util.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "net/http/http_status_code.h"
 #include "net/url_request/test_url_fetcher_factory.h"
 #include "net/url_request/url_fetcher_delegate.h"
@@ -71,7 +71,7 @@
 class OAuth2TokenServiceTest : public testing::Test {
  public:
   void SetUp() override {
-    mojo::edk::Init();
+    mojo::core::Init();
     auto delegate = std::make_unique<FakeOAuth2TokenServiceDelegate>(
         new net::TestURLRequestContextGetter(message_loop_.task_runner()));
     test_url_loader_factory_ = delegate->test_url_loader_factory();
diff --git a/google_apis/gcm/tools/mcs_probe.cc b/google_apis/gcm/tools/mcs_probe.cc
index 9412cb3..dedbe02 100644
--- a/google_apis/gcm/tools/mcs_probe.cc
+++ b/google_apis/gcm/tools/mcs_probe.cc
@@ -181,7 +181,7 @@
   int Verify(const RequestParams& params,
              net::CRLSet* crl_set,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback& callback,
+             net::CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const net::NetLogWithSource& net_log) override {
     return net::OK;
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index 204456cc..4042760 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -472,7 +472,7 @@
     "//gpu/ipc/host",
     "//gpu/ipc/service",
     "//ipc:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//net:test_support",
     "//skia",
diff --git a/gpu/command_buffer/common/DEPS b/gpu/command_buffer/common/DEPS
index c7504c1bf..8894067 100644
--- a/gpu/command_buffer/common/DEPS
+++ b/gpu/command_buffer/common/DEPS
@@ -4,7 +4,7 @@
 ]
 specific_include_rules = {
   "unittest_main\.cc": [
-    "+mojo/edk/embedder/embedder.h",
+    "+mojo/core/embedder/embedder.h",
   ],
   "activity_flags.h": [
     "+mojo/public/cpp/system/buffer.h",
diff --git a/gpu/command_buffer/common/unittest_main.cc b/gpu/command_buffer/common/unittest_main.cc
index 3e6aea3..aa47431 100644
--- a/gpu/command_buffer/common/unittest_main.cc
+++ b/gpu/command_buffer/common/unittest_main.cc
@@ -8,7 +8,7 @@
 #include "base/test/test_io_thread.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 namespace {
 
@@ -32,7 +32,7 @@
   base::CommandLine::Init(argc, argv);
   GpuTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(
       argc, argv,
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index 1e575aa..6fca3982 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -238,7 +238,7 @@
     "//ios/third_party/material_roboto_font_loader_ios",
     "//ios/web",
     "//ios/web/public/app",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net",
     "//skia",
     "//ui/base",
diff --git a/ios/chrome/app/DEPS b/ios/chrome/app/DEPS
index 1cd9d1be..302d8e25 100644
--- a/ios/chrome/app/DEPS
+++ b/ios/chrome/app/DEPS
@@ -26,7 +26,7 @@
   "+ios/chrome/browser/feature_engagement",
   "+ios/net",
   "+ios/public/provider/chrome",
-  "+mojo/edk/embedder/embedder.h",
+  "+mojo/core/embedder/embedder.h",
   "+third_party/breakpad/breakpad/src/client/ios",
 
   # Strings and resources.
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index e9ec462..f050030b 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -161,7 +161,7 @@
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_view_creation_util.h"
 #include "ios/web/public/webui/web_ui_ios_controller_factory.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #import "net/base/mac/url_conversions.h"
 #include "net/url_request/url_request_context.h"
 
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
index a7b6eb12..7810566 100644
--- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm
+++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
@@ -11,6 +11,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "components/autofill/core/browser/webdata/autocomplete_sync_bridge.h"
+#include "components/autofill/core/browser/webdata/autofill_profile_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_profile_syncable_service.h"
 #include "components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h"
 #include "components/autofill/core/browser/webdata/autofill_wallet_syncable_service.h"
@@ -336,6 +337,11 @@
                  web_data_service_.get())
           ->change_processor()
           ->GetControllerDelegateOnUIThread();
+    case syncer::AUTOFILL_PROFILE:
+      return autofill::AutofillProfileSyncBridge::FromWebDataService(
+                 web_data_service_.get())
+          ->change_processor()
+          ->GetControllerDelegateOnUIThread();
     case syncer::TYPED_URLS: {
       history::HistoryService* history =
           ios::HistoryServiceFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_page_control.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_page_control.mm
index 098a014..120b075d 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_page_control.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_page_control.mm
@@ -97,9 +97,9 @@
 // Color for the slider
 const int kSliderColor = 0xF8F9FA;
 // Color for the background view.
-const int kBackgroundColor = 0x5F6368;
+const int kBackgroundColor = 0xFFFFFF;
 // Alpha for the background view.
-const CGFloat kBackgroundAlpha = 1.0;
+const CGFloat kBackgroundAlpha = 0.3;
 // Color for the regular tab count label and icons.
 const CGFloat kSelectedColor = 0x3C4043;
 
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index 770a9778..70afe28 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -91,7 +91,7 @@
     ":test_support",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
 }
 
diff --git a/ios/chrome/test/DEPS b/ios/chrome/test/DEPS
index 324a436..09b75044 100644
--- a/ios/chrome/test/DEPS
+++ b/ios/chrome/test/DEPS
@@ -18,7 +18,7 @@
   "+ios/chrome/browser",
   "+ios/public/provider/chrome",
   "+ios/public/test",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+net/url_request",
   "+services/network/public/cpp",
   "+third_party/breakpad/breakpad/src/client/ios",
diff --git a/ios/chrome/test/run_all_unittests.cc b/ios/chrome/test/run_all_unittests.cc
index 046cb47..e417906 100644
--- a/ios/chrome/test/run_all_unittests.cc
+++ b/ios/chrome/test/run_all_unittests.cc
@@ -7,20 +7,20 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/threading/thread.h"
 #include "ios/chrome/test/ios_chrome_unit_test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 
 int main(int argc, char** argv) {
   IOSChromeUnitTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   base::Thread ipc_thread("IPC thread");
   ipc_thread.StartWithOptions(
       base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
 
   return base::LaunchUnitTests(
       argc, argv,
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index 10ea8507..a630f89 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -136,7 +136,7 @@
     "//base/test:test_support",
     "//ios/web/public/test",
     "//ios/web/public/test/http_server",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
 }
 
@@ -568,7 +568,7 @@
     "//ios/web/test:test_constants",
     "//ios/web/test:test_support",
     "//ios/web/web_state",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net:test_support",
     "//services/network/public/cpp",
     "//services/service_manager/public/cpp",
diff --git a/ios/web/DEPS b/ios/web/DEPS
index cb4ff80..7f2767d7 100644
--- a/ios/web/DEPS
+++ b/ios/web/DEPS
@@ -17,5 +17,5 @@
   # For tests.
   "+ios/testing",
   "+ios/third_party/earl_grey/src",
-  "+mojo/edk/embedder/embedder.h",
+  "+mojo/core/embedder/embedder.h",
 ]
diff --git a/ios/web/app/BUILD.gn b/ios/web/app/BUILD.gn
index 8c8f41b..93e0dd9 100644
--- a/ios/web/app/BUILD.gn
+++ b/ios/web/app/BUILD.gn
@@ -20,7 +20,7 @@
     "//crypto",
     "//ios/web",
     "//ios/web/public/global_state",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net",
     "//ui/base",
     "//ui/gfx",
diff --git a/ios/web/app/web_main_runner.mm b/ios/web/app/web_main_runner.mm
index 582dccfa..c135ac6 100644
--- a/ios/web/app/web_main_runner.mm
+++ b/ios/web/app/web_main_runner.mm
@@ -11,7 +11,7 @@
 #include "ios/web/public/global_state/ios_global_state.h"
 #include "ios/web/public/url_schemes.h"
 #import "ios/web/public/web_client.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/base/ui_base_paths.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -52,7 +52,7 @@
     }
     completed_basic_startup_ = true;
 
-    mojo::edk::Init();
+    mojo::core::Init();
 
     // TODO(rohitrao): Should we instead require that all embedders call
     // SetWebClient()?
diff --git a/ios/web/test/run_all_unittests.cc b/ios/web/test/run_all_unittests.cc
index 91442da..cffd90a3 100644
--- a/ios/web/test/run_all_unittests.cc
+++ b/ios/web/test/run_all_unittests.cc
@@ -5,12 +5,12 @@
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "ios/web/public/test/web_test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   web::WebTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(
       argc, argv, base::Bind(&web::WebTestSuite::Run,
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn
index d8950f09..65ded46 100644
--- a/ios/web_view/BUILD.gn
+++ b/ios/web_view/BUILD.gn
@@ -317,7 +317,7 @@
   deps = [
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
 }
 
diff --git a/ios/web_view/test/DEPS b/ios/web_view/test/DEPS
index 2f4c024e8..fa59dfb 100644
--- a/ios/web_view/test/DEPS
+++ b/ios/web_view/test/DEPS
@@ -2,6 +2,6 @@
   "+base",
   "+ios/testing",
   "+ios/web_view/public",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+net",
 ]
diff --git a/ios/web_view/test/run_all_unittests.cc b/ios/web_view/test/run_all_unittests.cc
index d7be30c..dbc72c0 100644
--- a/ios/web_view/test/run_all_unittests.cc
+++ b/ios/web_view/test/run_all_unittests.cc
@@ -5,11 +5,11 @@
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   base::TestSuite test_suite(argc, argv);
-  mojo::edk::Init();
+  mojo::core::Init();
   return base::LaunchUnitTests(
       argc, argv,
       base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
diff --git a/ipc/BUILD.gn b/ipc/BUILD.gn
index be17fd7b..8c665fb 100644
--- a/ipc/BUILD.gn
+++ b/ipc/BUILD.gn
@@ -223,8 +223,8 @@
     deps = [
       "//base",
       "//base/test:test_support",
-      "//mojo/edk",
-      "//mojo/edk/test:test_support",
+      "//mojo/core/embedder",
+      "//mojo/core/test:test_support",
     ]
   }
 
@@ -270,8 +270,8 @@
       "//base:i18n",
       "//base/test:test_support",
       "//crypto",
-      "//mojo/edk",
-      "//mojo/edk/test:test_support",
+      "//mojo/core/embedder",
+      "//mojo/core/test:test_support",
       "//testing/gtest",
     ]
 
@@ -309,9 +309,9 @@
       "//base",
       "//base:i18n",
       "//base/test:test_support",
-      "//mojo/edk",
-      "//mojo/edk/test:test_support",
-      "//mojo/edk/test:test_support_impl",
+      "//mojo/core/embedder",
+      "//mojo/core/test:test_support",
+      "//mojo/core/test:test_support_impl",
       "//testing/gtest",
     ]
   }
@@ -334,7 +334,7 @@
     deps = [
       "//base",
       "//base/test:test_support",
-      "//mojo/edk/test:test_support",
+      "//mojo/core/test:test_support",
       "//testing/gtest",
     ]
   }
diff --git a/ipc/DEPS b/ipc/DEPS
index 662e341..73d88fe 100644
--- a/ipc/DEPS
+++ b/ipc/DEPS
@@ -8,19 +8,19 @@
 
 specific_include_rules = {
   "ipc_test_base\.h": [
-    "+mojo/edk/test",
+    "+mojo/core/test",
   ],
   "ipc_mojo_(bootstrap_unittest|perftest)\.cc": [
-    "+mojo/edk/embedder",
-    "+mojo/edk/test",
+    "+mojo/core/embedder",
+    "+mojo/core/test",
   ],
   "ipc_.*perftest.*\.cc": [
-    "+mojo/edk/embedder",
-    "+mojo/edk/test",
+    "+mojo/core/embedder",
+    "+mojo/core/test",
   ],
   "run_all_(unit|perf)tests\.cc": [
-    "+mojo/edk/embedder",
-    "+mojo/edk/test",
+    "+mojo/core/embedder",
+    "+mojo/core/test",
   ],
   "ipc_message_protobuf_utils\.h": [
     # Support serializing RepeatedField / RepeatedPtrField:
diff --git a/ipc/ipc_cpu_perftest.cc b/ipc/ipc_cpu_perftest.cc
index 5c272eae..6cb8dfc 100644
--- a/ipc/ipc_cpu_perftest.cc
+++ b/ipc/ipc_cpu_perftest.cc
@@ -17,8 +17,8 @@
 #include "ipc/ipc_sync_channel.h"
 #include "ipc/ipc_test.mojom.h"
 #include "ipc/ipc_test_base.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
+#include "mojo/core/test/mojo_test_base.h"
+#include "mojo/core/test/multiprocess_test_helper.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 
@@ -81,7 +81,7 @@
 
 MULTIPROCESS_TEST_MAIN(MojoPerfTestClientTestChildMain) {
   MojoPerfTestClient client;
-  int rv = mojo::edk::test::MultiprocessTestHelper::RunClientMain(
+  int rv = mojo::core::test::MultiprocessTestHelper::RunClientMain(
       base::Bind(&MojoPerfTestClient::Run, base::Unretained(&client)),
       true /* pass_pipe_ownership_to_main */);
 
@@ -264,7 +264,7 @@
   RunPingPongServer("IPC_CPU_Sync", true);
 }
 
-class MojoSteadyPingPongTest : public mojo::edk::test::MojoTestBase {
+class MojoSteadyPingPongTest : public mojo::core::test::MojoTestBase {
  public:
   MojoSteadyPingPongTest() = default;
 
diff --git a/ipc/ipc_mojo_bootstrap_unittest.cc b/ipc/ipc_mojo_bootstrap_unittest.cc
index b12b978..e5d9518 100644
--- a/ipc/ipc_mojo_bootstrap_unittest.cc
+++ b/ipc/ipc_mojo_bootstrap_unittest.cc
@@ -13,7 +13,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "ipc/ipc.mojom.h"
 #include "ipc/ipc_test_base.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
+#include "mojo/core/test/multiprocess_test_helper.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 
 namespace {
@@ -106,7 +106,7 @@
 
 class IPCMojoBootstrapTest : public testing::Test {
  protected:
-  mojo::edk::test::MultiprocessTestHelper helper_;
+  mojo::core::test::MultiprocessTestHelper helper_;
 };
 
 TEST_F(IPCMojoBootstrapTest, Connect) {
@@ -134,11 +134,11 @@
 // A long running process that connects to us.
 MULTIPROCESS_TEST_MAIN_WITH_SETUP(
     IPCMojoBootstrapTestClientTestChildMain,
-    ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {
+    ::mojo::core::test::MultiprocessTestHelper::ChildSetup) {
   base::MessageLoop message_loop;
   Connection connection(
       IPC::MojoBootstrap::Create(
-          std::move(mojo::edk::test::MultiprocessTestHelper::primordial_pipe),
+          std::move(mojo::core::test::MultiprocessTestHelper::primordial_pipe),
           IPC::Channel::MODE_CLIENT, base::ThreadTaskRunnerHandle::Get(),
           base::ThreadTaskRunnerHandle::Get()),
       kTestClientPid);
@@ -182,11 +182,11 @@
 // A long running process that connects to us.
 MULTIPROCESS_TEST_MAIN_WITH_SETUP(
     IPCMojoBootstrapTestEmptyMessageTestChildMain,
-    ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {
+    ::mojo::core::test::MultiprocessTestHelper::ChildSetup) {
   base::MessageLoop message_loop;
   Connection connection(
       IPC::MojoBootstrap::Create(
-          std::move(mojo::edk::test::MultiprocessTestHelper::primordial_pipe),
+          std::move(mojo::core::test::MultiprocessTestHelper::primordial_pipe),
           IPC::Channel::MODE_CLIENT, base::ThreadTaskRunnerHandle::Get(),
           base::ThreadTaskRunnerHandle::Get()),
       kTestClientPid);
diff --git a/ipc/ipc_mojo_perftest.cc b/ipc/ipc_mojo_perftest.cc
index 754f0e0..c53a78f 100644
--- a/ipc/ipc_mojo_perftest.cc
+++ b/ipc/ipc_mojo_perftest.cc
@@ -21,9 +21,9 @@
 #include "ipc/ipc_sync_channel.h"
 #include "ipc/ipc_test.mojom.h"
 #include "ipc/ipc_test_base.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/test/mojo_test_base.h"
+#include "mojo/core/test/multiprocess_test_helper.h"
 #include "mojo/public/cpp/bindings/associated_binding_set.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
@@ -263,7 +263,7 @@
 
 MULTIPROCESS_TEST_MAIN(MojoPerfTestClientTestChildMain) {
   MojoPerfTestClient client;
-  int rv = mojo::edk::test::MultiprocessTestHelper::RunClientMain(
+  int rv = mojo::core::test::MultiprocessTestHelper::RunClientMain(
       base::Bind(&MojoPerfTestClient::Run, base::Unretained(&client)),
       true /* pass_pipe_ownership_to_main */);
 
@@ -273,7 +273,7 @@
   return rv;
 }
 
-class MojoInterfacePerfTest : public mojo::edk::test::MojoTestBase {
+class MojoInterfacePerfTest : public mojo::core::test::MojoTestBase {
  public:
   MojoInterfacePerfTest() : message_count_(0), count_down_(0) {}
 
@@ -410,7 +410,7 @@
   base::Closure quit_closure_;
 };
 
-class MojoInterfacePassingPerfTest : public mojo::edk::test::MojoTestBase {
+class MojoInterfacePassingPerfTest : public mojo::core::test::MojoTestBase {
  public:
   MojoInterfacePassingPerfTest() = default;
 
diff --git a/ipc/ipc_perftest_util.cc b/ipc/ipc_perftest_util.cc
index bc9bf1a..3d49189 100644
--- a/ipc/ipc_perftest_util.cc
+++ b/ipc/ipc_perftest_util.cc
@@ -8,13 +8,13 @@
 #include "base/run_loop.h"
 #include "ipc/ipc_channel_proxy.h"
 #include "ipc/ipc_perftest_messages.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/test/multiprocess_test_helper.h"
 
 namespace IPC {
 
 scoped_refptr<base::SingleThreadTaskRunner> GetIOThreadTaskRunner() {
-  scoped_refptr<base::TaskRunner> runner = mojo::edk::GetIOTaskRunner();
+  scoped_refptr<base::TaskRunner> runner = mojo::core::GetIOTaskRunner();
   return scoped_refptr<base::SingleThreadTaskRunner>(
       static_cast<base::SingleThreadTaskRunner*>(runner.get()));
 }
@@ -102,7 +102,7 @@
 
 MojoPerfTestClient::MojoPerfTestClient()
     : listener_(new ChannelReflectorListener()) {
-  mojo::edk::test::MultiprocessTestHelper::ChildSetup();
+  mojo::core::test::MultiprocessTestHelper::ChildSetup();
 }
 
 MojoPerfTestClient::~MojoPerfTestClient() = default;
diff --git a/ipc/ipc_test_base.h b/ipc/ipc_test_base.h
index ae69f10..2555611 100644
--- a/ipc/ipc_test_base.h
+++ b/ipc/ipc_test_base.h
@@ -16,8 +16,8 @@
 #include "ipc/ipc_channel.h"
 #include "ipc/ipc_channel_factory.h"
 #include "ipc/ipc_channel_proxy.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
+#include "mojo/core/test/mojo_test_base.h"
+#include "mojo/core/test/multiprocess_test_helper.h"
 
 namespace base {
 class MessageLoop;
@@ -54,7 +54,7 @@
   std::unique_ptr<base::MessageLoop> message_loop_;
 
   mojo::ScopedMessagePipeHandle handle_;
-  mojo::edk::test::MultiprocessTestHelper helper_;
+  mojo::core::test::MultiprocessTestHelper helper_;
 
   std::unique_ptr<IPC::Channel> channel_;
 
@@ -83,24 +83,24 @@
 // Use this to declare the client side for tests using IPCChannelMojoTestBase
 // when a custom test fixture class is required in the client. |test_base| must
 // be derived from IpcChannelMojoTestClient.
-#define DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE(client_name,  \
-                                                                test_base)    \
-  class client_name##_MainFixture : public test_base {                        \
-   public:                                                                    \
-    void Main();                                                              \
-  };                                                                          \
-  MULTIPROCESS_TEST_MAIN_WITH_SETUP(                                          \
-      client_name##TestChildMain,                                             \
-      ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {                \
-    client_name##_MainFixture test;                                           \
-    test.Init(                                                                \
-        std::move(mojo::edk::test::MultiprocessTestHelper::primordial_pipe)); \
-    test.Main();                                                              \
-    return (::testing::Test::HasFatalFailure() ||                             \
-            ::testing::Test::HasNonfatalFailure())                            \
-               ? 1                                                            \
-               : 0;                                                           \
-  }                                                                           \
+#define DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE(client_name,   \
+                                                                test_base)     \
+  class client_name##_MainFixture : public test_base {                         \
+   public:                                                                     \
+    void Main();                                                               \
+  };                                                                           \
+  MULTIPROCESS_TEST_MAIN_WITH_SETUP(                                           \
+      client_name##TestChildMain,                                              \
+      ::mojo::core::test::MultiprocessTestHelper::ChildSetup) {                \
+    client_name##_MainFixture test;                                            \
+    test.Init(                                                                 \
+        std::move(mojo::core::test::MultiprocessTestHelper::primordial_pipe)); \
+    test.Main();                                                               \
+    return (::testing::Test::HasFatalFailure() ||                              \
+            ::testing::Test::HasNonfatalFailure())                             \
+               ? 1                                                             \
+               : 0;                                                            \
+  }                                                                            \
   void client_name##_MainFixture::Main()
 
 // Use this to declare the client side for tests using IPCChannelMojoTestBase.
diff --git a/ipc/run_all_perftests.cc b/ipc/run_all_perftests.cc
index b22c912..b5948e1 100644
--- a/ipc/run_all_perftests.cc
+++ b/ipc/run_all_perftests.cc
@@ -2,24 +2,24 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Copied from mojo/edk/test/run_all_perftests.cc.
+// Copied from mojo/core/test/run_all_perftests.cc.
 
 #include "base/command_line.h"
 #include "base/test/perf_test_suite.h"
 #include "base/test/test_io_thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/edk/test/test_support_impl.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
+#include "mojo/core/test/test_support_impl.h"
 
 int main(int argc, char** argv) {
   base::PerfTestSuite test(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
   base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       test_io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-  mojo::test::TestSupport::Init(new mojo::edk::test::TestSupportImpl());
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+  mojo::test::TestSupport::Init(new mojo::core::test::TestSupportImpl());
 
   return test.Run();
 }
diff --git a/ipc/run_all_unittests.cc b/ipc/run_all_unittests.cc
index cd62e45..bca29c6 100644
--- a/ipc/run_all_unittests.cc
+++ b/ipc/run_all_unittests.cc
@@ -8,8 +8,8 @@
 #include "base/test/test_io_thread.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
 #include "base/mac/mach_port_broker.h"
@@ -17,16 +17,16 @@
 
 int main(int argc, char** argv) {
   base::TestSuite test_suite(argc, argv);
-  mojo::edk::Init();
+  mojo::core::Init();
   base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       test_io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
   base::MachPortBroker mach_broker("mojo_test");
   CHECK(mach_broker.Init());
-  mojo::edk::SetMachPortProvider(&mach_broker);
+  mojo::core::SetMachPortProvider(&mach_broker);
 #endif
 
   return base::LaunchUnitTests(
diff --git a/mash/BUILD.gn b/mash/BUILD.gn
index ef752ca..d5110af 100644
--- a/mash/BUILD.gn
+++ b/mash/BUILD.gn
@@ -100,7 +100,7 @@
       "//cc",
       "//cc:test_support",
       "//components/viz/service",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//services/catalog:lib",
       "//ui/aura",
       "//ui/base",
diff --git a/mash/runner/BUILD.gn b/mash/runner/BUILD.gn
index 92b79ef..4cb3030c 100644
--- a/mash/runner/BUILD.gn
+++ b/mash/runner/BUILD.gn
@@ -13,7 +13,7 @@
     "//base",
     "//base:i18n",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//services/service_manager",
     "//services/service_manager/runner:init",
     "//services/service_manager/standalone",
diff --git a/mash/runner/DEPS b/mash/runner/DEPS
index 61ef5fec..9243dcd6 100644
--- a/mash/runner/DEPS
+++ b/mash/runner/DEPS
@@ -1,3 +1,3 @@
 include_rules = [
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
 ]
diff --git a/mash/runner/main.cc b/mash/runner/main.cc
index 73c3ae5..9484317 100644
--- a/mash/runner/main.cc
+++ b/mash/runner/main.cc
@@ -25,8 +25,8 @@
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "services/service_manager/runner/init.h"
 #include "services/service_manager/standalone/context.h"
 #include "services/service_manager/switches.h"
@@ -72,7 +72,7 @@
 
   base::i18n::InitializeICU();
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   base::Thread ipc_thread("IPC thread");
   ipc_thread.StartWithOptions(
@@ -80,9 +80,9 @@
 
   // We can use fast IPC shutdown here since service manager termination must
   // effectively bring down all services as well.
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
 
   base::test::ScopedTaskEnvironment scoped_task_environment;
   service_manager::Context service_manager_context(nullptr,
diff --git a/mash/test/DEPS b/mash/test/DEPS
index 9f6d609..53a88d2 100644
--- a/mash/test/DEPS
+++ b/mash/test/DEPS
@@ -1,6 +1,6 @@
 include_rules = [
   "+ash/test",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+services/catalog",
 ]
 
diff --git a/mash/test/mash_unittests.cc b/mash/test/mash_unittests.cc
index b517633..b9b2bd5 100644
--- a/mash/test/mash_unittests.cc
+++ b/mash/test/mash_unittests.cc
@@ -8,8 +8,8 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/threading/thread.h"
 #include "mash/test/mash_test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "services/catalog/catalog.h"
 
 namespace {
@@ -25,13 +25,13 @@
   catalog::Catalog::LoadDefaultCatalogManifest(
       base::FilePath(kCatalogFilename));
 
-  mojo::edk::Init();
+  mojo::core::Init();
   base::Thread ipc_thread("IPC thread");
   ipc_thread.StartWithOptions(
       base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
 
   return base::LaunchUnitTests(argc, argv,
                                base::Bind(&mash::test::MashTestSuite::Run,
diff --git a/media/blink/BUILD.gn b/media/blink/BUILD.gn
index ffce7bd3..ccf2111 100644
--- a/media/blink/BUILD.gn
+++ b/media/blink/BUILD.gn
@@ -115,7 +115,7 @@
     "//media:test_support",
     "//media/mojo/interfaces",
     "//media/mojo/services",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/media/blink/DEPS b/media/blink/DEPS
index c0f8ccc7..c30001fa 100644
--- a/media/blink/DEPS
+++ b/media/blink/DEPS
@@ -7,7 +7,7 @@
   "+components/viz/common/surfaces/frame_sink_id.h",
   "+gin",
   "+media",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+mojo/public/cpp/bindings",
   "+net/base",
   "+net/http",
diff --git a/media/blink/run_all_unittests.cc b/media/blink/run_all_unittests.cc
index ee1d2923..72eea59 100644
--- a/media/blink/run_all_unittests.cc
+++ b/media/blink/run_all_unittests.cc
@@ -20,7 +20,7 @@
 #endif
 
 #if !defined(OS_IOS)
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #endif
 
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
@@ -78,7 +78,7 @@
 
 #if !defined(OS_IOS)
   // Initialize mojo firstly to enable Blink initialization to use it.
-  mojo::edk::Init();
+  mojo::core::Init();
 #endif
 
   BlinkPlatformWithTaskEnvironment platform_;
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn
index 0c44c1b3..93ea0b7f 100644
--- a/media/capture/BUILD.gn
+++ b/media/capture/BUILD.gn
@@ -312,7 +312,7 @@
     "//media:test_support",
     "//media/capture/mojom:image_capture",
     "//media/capture/mojom:image_capture_types",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//testing/gmock",
     "//testing/gtest",
     "//ui/gfx:test_support",
@@ -362,7 +362,7 @@
     deps += [
       "//chromeos:chromeos",
       "//media/capture/video/chromeos/mojo:cros_camera",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//third_party/libdrm",
       "//third_party/libsync",
       "//third_party/minigbm",
diff --git a/media/capture/DEPS b/media/capture/DEPS
index d415fec5..809f1c1 100644
--- a/media/capture/DEPS
+++ b/media/capture/DEPS
@@ -1,3 +1,3 @@
 specific_include_rules = {
-  "run_all_unittests.cc": [ "+mojo/edk/embedder" ],
+  "run_all_unittests.cc": [ "+mojo/core/embedder" ],
 }
diff --git a/media/capture/run_all_unittests.cc b/media/capture/run_all_unittests.cc
index d196bb6..9c4b277 100644
--- a/media/capture/run_all_unittests.cc
+++ b/media/capture/run_all_unittests.cc
@@ -9,8 +9,8 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
 #include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 class MojoEnabledTestEnvironment final : public testing::Environment {
@@ -20,12 +20,12 @@
   ~MojoEnabledTestEnvironment() final = default;
 
   void SetUp() final {
-    mojo::edk::Init();
+    mojo::core::Init();
     mojo_ipc_thread_.StartWithOptions(
         base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
-    mojo_ipc_support_.reset(new mojo::edk::ScopedIPCSupport(
+    mojo_ipc_support_.reset(new mojo::core::ScopedIPCSupport(
         mojo_ipc_thread_.task_runner(),
-        mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST));
+        mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST));
     VLOG(1) << "Mojo initialized";
   }
 
@@ -36,7 +36,7 @@
 
  private:
   base::Thread mojo_ipc_thread_;
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> mojo_ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> mojo_ipc_support_;
 };
 
 int main(int argc, char* argv[]) {
diff --git a/media/mojo/BUILD.gn b/media/mojo/BUILD.gn
index 2fc42466..21dc54f0 100644
--- a/media/mojo/BUILD.gn
+++ b/media/mojo/BUILD.gn
@@ -91,6 +91,6 @@
 test("media_mojo_unittests") {
   deps = [
     ":unit_tests",
-    "//mojo/edk/test:run_all_unittests",
+    "//mojo/core/test:run_all_unittests",
   ]
 }
diff --git a/media/mojo/DEPS b/media/mojo/DEPS
index 7216ea6..496a6c52 100644
--- a/media/mojo/DEPS
+++ b/media/mojo/DEPS
@@ -5,7 +5,7 @@
   "+mojo/public",
 
   # For changing the bad message handler for tests.
-  "+mojo/edk/embedder/embedder.h",
+  "+mojo/core/embedder/embedder.h",
 
   # TODO(xhwang): Ideally media should not worry about sandbox. Find a way to
   # remove this dependency.
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn
index 938b4c6..99bbf748 100644
--- a/media/mojo/services/BUILD.gn
+++ b/media/mojo/services/BUILD.gn
@@ -177,7 +177,7 @@
     "//components/ukm:test_support",
     "//media:test_support",
     "//media/mojo:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/interfaces/bindings/tests:test_interfaces",
     "//services/metrics/public/cpp:ukm_builders",
     "//testing/gmock",
diff --git a/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc b/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc
index e559976..c0e1dfe0 100644
--- a/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc
+++ b/media/mojo/services/mojo_audio_output_stream_provider_unittest.cc
@@ -12,7 +12,7 @@
 #include "build/build_config.h"
 #include "media/audio/audio_output_delegate.h"
 #include "media/base/audio_parameters.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -68,7 +68,7 @@
 TEST(MojoAudioOutputStreamProviderTest, AcquireTwice_BadMessage) {
   base::MessageLoop loop;
   bool got_bad_message = false;
-  mojo::edk::SetDefaultProcessErrorCallback(
+  mojo::core::SetDefaultProcessErrorCallback(
       base::BindRepeating([](bool* got_bad_message,
                              const std::string& s) { *got_bad_message = true; },
                           &got_bad_message));
@@ -96,14 +96,15 @@
   EXPECT_TRUE(got_bad_message);
   Mock::VerifyAndClear(&deleter);
 
-  mojo::edk::SetDefaultProcessErrorCallback(mojo::edk::ProcessErrorCallback());
+  mojo::core::SetDefaultProcessErrorCallback(
+      mojo::core::ProcessErrorCallback());
 }
 
 TEST(MojoAudioOutputStreamProviderTest,
      Bitstream_BadMessageOnNonAndoirdPlatforms) {
   base::MessageLoop loop;
   bool got_bad_message = false;
-  mojo::edk::SetDefaultProcessErrorCallback(
+  mojo::core::SetDefaultProcessErrorCallback(
       base::BindRepeating([](bool* got_bad_message,
                              const std::string& s) { *got_bad_message = true; },
                           &got_bad_message));
@@ -135,7 +136,8 @@
   EXPECT_TRUE(got_bad_message);
   Mock::VerifyAndClear(&deleter);
 #endif
-  mojo::edk::SetDefaultProcessErrorCallback(mojo::edk::ProcessErrorCallback());
+  mojo::core::SetDefaultProcessErrorCallback(
+      mojo::core::ProcessErrorCallback());
 }
 
 }  // namespace media
diff --git a/media/test/BUILD.gn b/media/test/BUILD.gn
index 2e6bdabd..0478dd1 100644
--- a/media/test/BUILD.gn
+++ b/media/test/BUILD.gn
@@ -15,7 +15,7 @@
     "//base",
     "//base/test:test_support",
     "//media:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
 
   if (is_android) {
diff --git a/media/test/DEPS b/media/test/DEPS
index b236bb7..34dfff80 100644
--- a/media/test/DEPS
+++ b/media/test/DEPS
@@ -1,4 +1,4 @@
 include_rules = [
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+services/service_manager/public/cpp",
 ]
diff --git a/media/test/run_all_unittests.cc b/media/test/run_all_unittests.cc
index 8111e9f..74ab74dc 100644
--- a/media/test/run_all_unittests.cc
+++ b/media/test/run_all_unittests.cc
@@ -10,7 +10,7 @@
 #include "media/base/fake_localized_strings.h"
 #include "media/base/media.h"
 #include "media/base/media_switches.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 #if defined(OS_ANDROID)
 #include "media/base/android/media_codec_util.h"
@@ -46,7 +46,7 @@
 }
 
 int main(int argc, char** argv) {
-  mojo::edk::Init();
+  mojo::core::Init();
   TestSuiteNoAtExit test_suite(argc, argv);
 
   return base::LaunchUnitTests(
diff --git a/mojo/BUILD.gn b/mojo/BUILD.gn
index 26713b3..92e0dfc 100644
--- a/mojo/BUILD.gn
+++ b/mojo/BUILD.gn
@@ -35,8 +35,8 @@
 
 test("mojo_unittests") {
   deps = [
-    "//mojo/edk/system:test_sources",
-    "//mojo/edk/test:run_all_unittests",
+    "//mojo/core:test_sources",
+    "//mojo/core/test:run_all_unittests",
     "//mojo/public/cpp/base:tests",
     "//mojo/public/cpp/bindings/tests",
     "//mojo/public/cpp/platform/tests",
@@ -46,23 +46,23 @@
 
 test("mojo_perftests") {
   deps = [
-    "//mojo/edk/test:run_all_perftests",
-    "//mojo/edk/test:test_support",
+    "//mojo/core/test:run_all_perftests",
+    "//mojo/core/test:test_support",
     "//mojo/public/c/system/tests:perftests",
     "//mojo/public/cpp/bindings/tests:perftests",
   ]
 
   if (!is_ios) {
     sources = [
-      "//mojo/edk/system/message_pipe_perftest.cc",
+      "//mojo/core/message_pipe_perftest.cc",
     ]
 
     deps += [
       "//base",
       "//base/test:test_support",
-      "//mojo/edk",
-      "//mojo/edk:edk_internal",
-      "//mojo/edk/system:test_utils",
+      "//mojo/core:embedder_internal",
+      "//mojo/core:test_utils",
+      "//mojo/core/embedder",
       "//testing/gtest",
     ]
   }
diff --git a/mojo/README.md b/mojo/README.md
index 7cbb45c..46d14fa4 100644
--- a/mojo/README.md
+++ b/mojo/README.md
@@ -19,50 +19,65 @@
 
 ## System Overview
 
-Mojo is a layered collection of runtime libraries providing a platform-agnostic
+Mojo is a collection of runtime libraries providing a platform-agnostic
 abstraction of common IPC primitives, a message IDL format, and a bindings
 library with code generation for multiple target languages to facilitate
 convenient message passing across arbitrary inter- and intra-process boundaries.
 
-The documentation here is segmented according to the different isolated layers
-and libraries comprising the system. The basic hierarchy of features is as
-follows:
+The documentation here is segmented according to the different libraries
+comprising Mojo. The basic hierarchy of features is as follows:
 
-![Mojo Library Layering: EDK on bottom, different language bindings on top, public system support APIs in the middle](https://docs.google.com/drawings/d/1RwhzKblXUZw-zhy_KDVobAYprYSqxZzopXTUsbwzDPw/pub?w=570&h=324)
+![Mojo Library Layering: Core on bottom, language bindings on top, public system support APIs in the middle](https://docs.google.com/drawings/d/1RwhzKblXUZw-zhy_KDVobAYprYSqxZzopXTUsbwzDPw/pub?w=570&h=324)
 
-## Embedder Development Kit (EDK)
-Most processes to be interconnected via Mojo IPC are called **Mojo embedders**
-and need to statically link against the
-[**Embedder Development Kit (EDK)**](/mojo/edk/embedder/README.md) library. The
-EDK exposes a few very basic APIs to initialize the Mojo system and setup basic
-IPC support.
+## Mojo Core
+In order to use any of the more interesting high-level support libraries like
+the System APIs or Bindings APIs, a process must first initialize Mojo Core.
+This is a one-time initialization which remains active for the remainder of the
+process's lifetime. There are two ways to initialize Mojo Core: via the Embedder
+API, or through a dynamically linked library.
 
-Details regarding where and how an application process actually embeds and
-configures the EDK are generaly hidden from the rest of the application code,
-and applications instead use the public System, Platform, and Bindings APIs to
-get things done.
+### Embedding
+Many processes to be interconnected via Mojo are **embedders**, meaning that
+they statically link against the `//mojo/core/embedder` target and initialize
+Mojo support within each process by calling `mojo::core::Init()`. See
+[**Mojo Core Embedder API**](/mojo/core/embedder/README.md) for more details.
 
-## Mojo Core Library
-On some platforms, it is also possible for applications to rely on a
-dynamically-linked `mojo_core` library in lieu of statically linking the EDK.
-This requires that the corresponding library (*e.g.*, `libmojo_core.so`) be
-present in the working directory or that the `MOJO_CORE_LIBRARY_PATH`
-environment variable point to the absolute path of such a library.
+This is a reasonable option when you can guarantee that all interconnected
+process binaries are linking against precisely the same revision of Mojo Core.
+To support other scenarios, use dynamic linking.
 
-When relying on `mojo_core`, an application may simply link against its own copy
-of Mojo's static public libraries, and call `MojoInitialize()` to enable general
-Mojo usage and IPC support. This is done *in exclusion* to direct EDK library
-initialization described in the previous section.
+## Dynamic Linking
+On some platforms, it's also possible for applications to rely on a
+dynamically-linked Mojo Core library (`libmojo_core.so` or `mojo_core.dll`)
+instead of statically linking against Mojo Core.
+
+In order to take advantage of this mechanism, the corresponding library must be
+present in either:
+
+  - The working directory of the application
+  - A directory named by the `MOJO_CORE_LIBRARY_PATH` environment variable
+  - A directory named explicitly by the application at runtime
+
+Instead of calling `mojo::core::Init()` as embedders do, an application using
+dynamic Mojo Core instead calls `MojoInitialize()` from the C System API. This
+call will attempt to locate (see above) and load a Mojo Core library to support
+subsequent Mojo API usage within the process.
+
+Note that the Mojo Core shared library presents a stable, forward-compatible C
+ABI which can support all current and future versions of the higher-level,
+public (and not binary-stable) System and Bindings APIs.
 
 ## C System API
 Once Mojo is initialized within a process, the public
 [**C System API**](/mojo/public/c/system/README.md) is usable on any thread for
 the remainder of the process's lifetime. This is a lightweight API with a
-relatively small, stable, forward-compatible ABI. Typically this API is not used
-directly, but it is the foundation upon which all higher-level public library
-APIs are built. It exposes the fundamental capabilities to create and interact
-with various types of Mojo handles including **message pipes**, **data pipes**,
-and **shared buffers**, as well as APIs to help bootstrap Mojo IPC between two
+relatively small, stable, forward-compatible ABI, comprising the total public
+API surface of the Mojo Core library.
+
+This API is rarely used directly, but it is the foundation upon which all
+higher-level Mojo APIs are built. It exposes the fundamental capabilities to
+create and interact Mojo primitives like **message pipes**, **data pipes**, and
+**shared buffers**, as well as APIs to help bootstrap connections among
 processes.
 
 ## Platform Support API
diff --git a/mojo/android/BUILD.gn b/mojo/android/BUILD.gn
index ce2b92e4..d6b97ce0 100644
--- a/mojo/android/BUILD.gn
+++ b/mojo/android/BUILD.gn
@@ -129,7 +129,7 @@
     ":system_java_jni_headers",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings/tests:mojo_public_bindings_test_utils",
     "//mojo/public/cpp/test_support:test_utils",
   ]
diff --git a/mojo/android/javatests/init_library.cc b/mojo/android/javatests/init_library.cc
index 2b2e81a5..2826d29b 100644
--- a/mojo/android/javatests/init_library.cc
+++ b/mojo/android/javatests/init_library.cc
@@ -4,7 +4,7 @@
 
 #include "base/android/base_jni_onload.h"
 #include "base/android/jni_android.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
   base::android::InitVM(vm);
@@ -12,6 +12,6 @@
   if (!base::android::OnJNIOnLoadInit())
     return -1;
 
-  mojo::edk::Init();
+  mojo::core::Init();
   return JNI_VERSION_1_4;
 }
diff --git a/mojo/core/BUILD.gn b/mojo/core/BUILD.gn
new file mode 100644
index 0000000..924b2d6f
--- /dev/null
+++ b/mojo/core/BUILD.gn
@@ -0,0 +1,324 @@
+# 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("//build/config/nacl/config.gni")
+import("//testing/test.gni")
+
+component("embedder_internal") {
+  output_name = "mojo_core_embedder_internal"
+  public_deps = [
+    ":impl_for_embedder",
+  ]
+  visibility = [
+    ":test_sources",
+    "//mojo:*",
+    "//mojo/core/embedder",
+  ]
+}
+
+# Bits of the EDK library which do not depend on public API linkage. It is
+# not allowed for this target or any of its transitive dependencies to depend
+# on anything under //mojo/public beyond strict C type definitions.
+#
+# This is templated because it's consumed by both the ":embedder_internal"
+# component library as well as the ":mojo_core" shared library. In the former
+# case we want to export symbols, but in the latter case we don't. The template
+# stamps out two nearly identical targets which differ only in what symbols they
+# export.
+template("core_impl_source_set") {
+  source_set(target_name) {
+    if (invoker.for_shared_library) {
+      visibility = [ ":shared_library" ]
+    } else {
+      visibility = [ ":embedder_internal" ]
+    }
+
+    public = [
+      "channel.h",
+      "configuration.h",
+      "connection_params.h",
+      "core.h",
+      "data_pipe_consumer_dispatcher.h",
+      "data_pipe_control_message.h",
+      "data_pipe_producer_dispatcher.h",
+      "dispatcher.h",
+      "embedder/configuration.h",
+      "embedder/process_error_callback.h",
+      "entrypoints.h",
+      "handle_signals_state.h",
+      "handle_table.h",
+      "invitation_dispatcher.h",
+      "message_pipe_dispatcher.h",
+      "node_controller.h",
+      "options_validation.h",
+      "platform_handle_dispatcher.h",
+      "platform_handle_utils.h",
+      "platform_shared_memory_mapping.h",
+      "request_context.h",
+      "scoped_process_handle.h",
+      "shared_buffer_dispatcher.h",
+      "user_message_impl.h",
+    ]
+
+    sources = [
+      "atomic_flag.h",
+      "broker.h",
+      "broker_win.cc",
+      "channel.cc",
+      "channel_win.cc",
+      "configuration.cc",
+      "connection_params.cc",
+      "core.cc",
+      "data_pipe_consumer_dispatcher.cc",
+      "data_pipe_control_message.cc",
+      "data_pipe_producer_dispatcher.cc",
+      "dispatcher.cc",
+      "entrypoints.cc",
+      "handle_table.cc",
+      "invitation_dispatcher.cc",
+      "message_pipe_dispatcher.cc",
+      "node_channel.cc",
+      "node_channel.h",
+      "node_controller.cc",
+      "platform_handle_dispatcher.cc",
+      "platform_handle_in_transit.cc",
+      "platform_handle_in_transit.h",
+      "platform_handle_utils.cc",
+      "platform_shared_memory_mapping.cc",
+      "request_context.cc",
+      "scoped_process_handle.cc",
+      "shared_buffer_dispatcher.cc",
+      "user_message_impl.cc",
+      "watch.cc",
+      "watch.h",
+      "watcher_dispatcher.cc",
+      "watcher_dispatcher.h",
+      "watcher_set.cc",
+      "watcher_set.h",
+    ]
+
+    public_deps = [
+      "//base",
+      "//mojo/core/ports",
+      "//mojo/public/c/system:headers",
+      "//mojo/public/cpp/platform",
+    ]
+
+    if (is_fuchsia) {
+      sources += [ "channel_fuchsia.cc" ]
+
+      public_deps += [ "//third_party/fuchsia-sdk:fdio" ]
+    }
+
+    if (is_posix) {
+      if (!is_nacl || is_nacl_nonsfi) {
+        sources += [
+          "broker_posix.cc",
+          "channel_posix.cc",
+        ]
+      }
+    }
+
+    if (is_mac && !is_ios) {
+      sources += [
+        "mach_port_relay.cc",
+        "mach_port_relay.h",
+      ]
+    }
+
+    if (!is_nacl || is_nacl_nonsfi) {
+      sources += [
+        "broker_host.cc",
+        "broker_host.h",
+      ]
+    }
+
+    defines = []
+    if (invoker.for_shared_library) {
+      defines += [ "MOJO_CORE_SHARED_LIBRARY" ]
+    } else {
+      defines += [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ]
+    }
+
+    deps = []
+    if (is_android) {
+      deps += [ "//third_party/ashmem" ]
+    }
+    if (!is_nacl) {
+      deps += [ "//crypto" ]
+    }
+
+    if (is_win) {
+      cflags = [ "/wd4324" ]  # Structure was padded due to __declspec(align()),
+                              # which is uninteresting.
+    }
+
+    # Use target_os == "chromeos" instead of is_chromeos because we need to
+    # build NaCl targets (i.e. IRT) for ChromeOS the same as the rest of ChromeOS.
+    if (is_android || target_os == "chromeos") {
+      defines += [ "MOJO_CORE_LEGACY_PROTOCOL" ]
+    }
+  }
+}
+
+core_impl_source_set("impl_for_embedder") {
+  for_shared_library = false
+}
+
+if (is_chromeos || is_linux || is_android || is_win) {
+  core_impl_source_set("impl_for_shared_library") {
+    for_shared_library = true
+  }
+
+  shared_library("shared_library") {
+    output_name = "mojo_core"
+    sources = [
+      "mojo_core.cc",
+    ]
+    defines = [ "MOJO_CORE_SHARED_LIBRARY" ]
+    deps = [
+      ":impl_for_shared_library",
+      "//mojo/public/c/system:headers",
+    ]
+    if (is_win) {
+      inputs = [
+        "mojo_core.def",
+      ]
+      ldflags = [ "/DEF:" + rebase_path("mojo_core.def", root_build_dir) ]
+    } else {
+      configs += [ ":export_only_thunks_api" ]
+    }
+  }
+
+  if (is_chromeos) {
+    if (target_cpu == "arm" || target_cpu == "arm64") {
+      android32_toolchain = "android_clang_arm"
+      android64_toolchain = "android_clang_arm64"
+    } else {
+      android32_toolchain = "android_clang_x86"
+      android64_toolchain = "android_clang_x64"
+    }
+
+    group("shared_libraries_for_arc") {
+      deps = [
+        ":shared_library_arc32",
+        ":shared_library_arc64",
+      ]
+    }
+
+    copy("shared_library_arc32") {
+      sources = [
+        "${root_out_dir}/${android32_toolchain}/libmojo_core.so",
+      ]
+      outputs = [
+        "${root_out_dir}/libmojo_core_arc32.so",
+      ]
+      deps = [
+        ":shared_library(//build/toolchain/android:${android32_toolchain})",
+      ]
+    }
+
+    copy("shared_library_arc64") {
+      sources = [
+        "${root_out_dir}/${android64_toolchain}/libmojo_core.so",
+      ]
+      outputs = [
+        "${root_out_dir}/libmojo_core_arc64.so",
+      ]
+      deps = [
+        ":shared_library(//build/toolchain/android:${android64_toolchain})",
+      ]
+    }
+  }
+
+  config("export_only_thunks_api") {
+    ldflags = [ "-Wl,--version-script=" +
+                rebase_path("//mojo/core/export_only_thunks_api.lst",
+                            root_build_dir) ]
+  }
+
+  if (is_chromeos || is_linux || is_win) {
+    test("mojo_core_unittests") {
+      sources = [
+        "mojo_core_unittest.cc",
+        "run_all_core_unittests.cc",
+      ]
+
+      deps = [
+        "//base",
+        "//base/test:test_support",
+        "//mojo/public/c/system",
+        "//testing/gtest",
+      ]
+
+      data_deps = [
+        ":shared_library",
+      ]
+    }
+  }
+}
+
+source_set("test_utils") {
+  testonly = true
+
+  sources = [
+    "test_utils.cc",
+    "test_utils.h",
+  ]
+
+  public_deps = [
+    "//mojo/public/c/system",
+    "//mojo/public/cpp/system",
+  ]
+
+  deps = [
+    "//base",
+    "//base/test:test_support",
+    "//mojo/core/test:test_support",
+    "//testing/gtest:gtest",
+  ]
+}
+
+source_set("test_sources") {
+  testonly = true
+  sources = [
+    "channel_unittest.cc",
+    "core_test_base.cc",
+    "core_test_base.h",
+    "core_unittest.cc",
+    "embedder_unittest.cc",
+    "handle_table_unittest.cc",
+    "message_pipe_unittest.cc",
+    "message_unittest.cc",
+    "options_validation_unittest.cc",
+    "platform_handle_dispatcher_unittest.cc",
+    "shared_buffer_dispatcher_unittest.cc",
+    "shared_buffer_unittest.cc",
+    "signals_unittest.cc",
+    "trap_unittest.cc",
+  ]
+
+  if (!is_ios) {
+    sources += [
+      "data_pipe_unittest.cc",
+      "invitation_unittest.cc",
+      "multiprocess_message_pipe_unittest.cc",
+      "platform_wrapper_unittest.cc",
+    ]
+  }
+
+  deps = [
+    ":test_utils",
+    "//base",
+    "//base/test:test_support",
+    "//mojo/core:embedder_internal",
+    "//mojo/core/embedder",
+    "//mojo/core/ports:tests",
+    "//mojo/core/test:run_all_unittests",
+    "//mojo/core/test:test_support",
+    "//mojo/public/cpp/system",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/mojo/edk/DEPS b/mojo/core/DEPS
similarity index 100%
rename from mojo/edk/DEPS
rename to mojo/core/DEPS
diff --git a/mojo/edk/system/OWNERS b/mojo/core/OWNERS
similarity index 100%
rename from mojo/edk/system/OWNERS
rename to mojo/core/OWNERS
diff --git a/mojo/edk/system/atomic_flag.h b/mojo/core/atomic_flag.h
similarity index 74%
rename from mojo/edk/system/atomic_flag.h
rename to mojo/core/atomic_flag.h
index 6bdcfaad..075b837 100644
--- a/mojo/edk/system/atomic_flag.h
+++ b/mojo/core/atomic_flag.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_ATOMIC_FLAG_H_
-#define MOJO_EDK_SYSTEM_ATOMIC_FLAG_H_
+#ifndef MOJO_CORE_ATOMIC_FLAG_H_
+#define MOJO_CORE_ATOMIC_FLAG_H_
 
 #include "base/atomicops.h"
 #include "base/macros.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // AtomicFlag is a boolean flag that can be set and tested atomically. It is
 // intended to be used to fast-path checks where the common case would normally
@@ -35,13 +35,9 @@
   AtomicFlag() : flag_(0) {}
   ~AtomicFlag() {}
 
-  void Set(bool value) {
-    base::subtle::Release_Store(&flag_, value ? 1 : 0);
-  }
+  void Set(bool value) { base::subtle::Release_Store(&flag_, value ? 1 : 0); }
 
-  bool Get() const {
-    return base::subtle::Acquire_Load(&flag_) ? true : false;
-  }
+  bool Get() const { return base::subtle::Acquire_Load(&flag_) ? true : false; }
 
   operator const bool() const { return Get(); }
 
@@ -51,7 +47,7 @@
   DISALLOW_COPY_AND_ASSIGN(AtomicFlag);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_ATOMIC_FLAG_H_
+#endif  // MOJO_CORE_ATOMIC_FLAG_H_
diff --git a/mojo/edk/system/broker.h b/mojo/core/broker.h
similarity index 92%
rename from mojo/edk/system/broker.h
rename to mojo/core/broker.h
index ba37ebb..41e0b89 100644
--- a/mojo/edk/system/broker.h
+++ b/mojo/core/broker.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 MOJO_EDK_SYSTEM_BROKER_H_
-#define MOJO_EDK_SYSTEM_BROKER_H_
+#ifndef MOJO_CORE_BROKER_H_
+#define MOJO_CORE_BROKER_H_
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
@@ -13,7 +13,7 @@
 #include "mojo/public/cpp/platform/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // The Broker is a channel to the broker process, which allows synchronous IPCs
 // to fulfill shared memory allocation requests on some platforms.
@@ -49,7 +49,7 @@
   DISALLOW_COPY_AND_ASSIGN(Broker);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_BROKER_H_
+#endif  // MOJO_CORE_BROKER_H_
diff --git a/mojo/edk/system/broker_host.cc b/mojo/core/broker_host.cc
similarity index 96%
rename from mojo/edk/system/broker_host.cc
rename to mojo/core/broker_host.cc
index d935133b..875cc2f 100644
--- a/mojo/edk/system/broker_host.cc
+++ b/mojo/core/broker_host.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 "mojo/edk/system/broker_host.h"
+#include "mojo/core/broker_host.h"
 
 #include <utility>
 
@@ -11,15 +11,15 @@
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/broker_messages.h"
-#include "mojo/edk/system/platform_handle_utils.h"
+#include "mojo/core/broker_messages.h"
+#include "mojo/core/platform_handle_utils.h"
 
 #if defined(OS_WIN)
 #include <windows.h>
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 BrokerHost::BrokerHost(base::ProcessHandle client_process,
                        ConnectionParams connection_params,
@@ -176,5 +176,5 @@
   delete this;
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/broker_host.h b/mojo/core/broker_host.h
similarity index 82%
rename from mojo/edk/system/broker_host.h
rename to mojo/core/broker_host.h
index 9cb0d8a..3ff36ea 100644
--- a/mojo/edk/system/broker_host.h
+++ b/mojo/core/broker_host.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 MOJO_EDK_SYSTEM_BROKER_HOST_H_
-#define MOJO_EDK_SYSTEM_BROKER_HOST_H_
+#ifndef MOJO_CORE_BROKER_HOST_H_
+#define MOJO_CORE_BROKER_HOST_H_
 
 #include <stdint.h>
 #include <vector>
@@ -12,15 +12,16 @@
 #include "base/message_loop/message_loop_current.h"
 #include "base/process/process_handle.h"
 #include "base/strings/string_piece.h"
-#include "mojo/edk/embedder/process_error_callback.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/connection_params.h"
-#include "mojo/edk/system/platform_handle_in_transit.h"
-#include "mojo/edk/system/scoped_process_handle.h"
+#include "build/build_config.h"
+#include "mojo/core/channel.h"
+#include "mojo/core/connection_params.h"
+#include "mojo/core/embedder/process_error_callback.h"
+#include "mojo/core/platform_handle_in_transit.h"
+#include "mojo/core/scoped_process_handle.h"
 #include "mojo/public/cpp/platform/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // The BrokerHost is a channel to a broker client process, servicing synchronous
 // IPCs issued by the client.
@@ -66,7 +67,7 @@
   DISALLOW_COPY_AND_ASSIGN(BrokerHost);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_BROKER_HOST_H_
+#endif  // MOJO_CORE_BROKER_HOST_H_
diff --git a/mojo/edk/system/broker_messages.h b/mojo/core/broker_messages.h
similarity index 91%
rename from mojo/edk/system/broker_messages.h
rename to mojo/core/broker_messages.h
index 88cab4e4..3bad6f5 100644
--- a/mojo/edk/system/broker_messages.h
+++ b/mojo/core/broker_messages.h
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_BROKER_MESSAGES_H_
-#define MOJO_EDK_SYSTEM_BROKER_MESSAGES_H_
+#ifndef MOJO_CORE_BROKER_MESSAGES_H_
+#define MOJO_CORE_BROKER_MESSAGES_H_
 
-#include "mojo/edk/system/channel.h"
+#include "build/build_config.h"
+#include "mojo/core/channel.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 #pragma pack(push, 1)
 
@@ -90,7 +91,7 @@
   return message;
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_BROKER_MESSAGES_H_
+#endif  // MOJO_CORE_BROKER_MESSAGES_H_
diff --git a/mojo/edk/system/broker_posix.cc b/mojo/core/broker_posix.cc
similarity index 95%
rename from mojo/edk/system/broker_posix.cc
rename to mojo/core/broker_posix.cc
index 815ce9f69..a2501af 100644
--- a/mojo/edk/system/broker_posix.cc
+++ b/mojo/core/broker_posix.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 "mojo/edk/system/broker.h"
+#include "mojo/core/broker.h"
 
 #include <fcntl.h>
 #include <unistd.h>
@@ -13,13 +13,13 @@
 #include "base/logging.h"
 #include "base/memory/platform_shared_memory_region.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/broker_messages.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/platform_handle_utils.h"
+#include "mojo/core/broker_messages.h"
+#include "mojo/core/channel.h"
+#include "mojo/core/platform_handle_utils.h"
 #include "mojo/public/cpp/platform/socket_utils_posix.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -144,5 +144,5 @@
   return base::WritableSharedMemoryRegion();
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/broker_win.cc b/mojo/core/broker_win.cc
similarity index 96%
rename from mojo/edk/system/broker_win.cc
rename to mojo/core/broker_win.cc
index f73b3a7..3ebc883 100644
--- a/mojo/edk/system/broker_win.cc
+++ b/mojo/core/broker_win.cc
@@ -11,14 +11,14 @@
 #include "base/memory/platform_shared_memory_region.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_piece.h"
-#include "mojo/edk/system/broker.h"
-#include "mojo/edk/system/broker_messages.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/platform_handle_utils.h"
+#include "mojo/core/broker.h"
+#include "mojo/core/broker_messages.h"
+#include "mojo/core/channel.h"
+#include "mojo/core/platform_handle_utils.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -158,5 +158,5 @@
   return base::WritableSharedMemoryRegion();
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/channel.cc b/mojo/core/channel.cc
similarity index 96%
rename from mojo/edk/system/channel.cc
rename to mojo/core/channel.cc
index 1083f9d..85d2a629 100644
--- a/mojo/edk/system/channel.cc
+++ b/mojo/core/channel.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 "mojo/edk/system/channel.h"
+#include "mojo/core/channel.h"
 
 #include <stddef.h>
 #include <string.h>
@@ -16,8 +16,8 @@
 #include "base/numerics/safe_math.h"
 #include "base/process/process_handle.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
+#include "mojo/core/configuration.h"
+#include "mojo/core/core.h"
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
 #include "base/mac/mach_logging.h"
@@ -26,7 +26,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -69,7 +69,7 @@
 Channel::Message::Message(size_t capacity,
                           size_t payload_size,
                           size_t max_handles)
-#if defined(MOJO_EDK_LEGACY_PROTOCOL)
+#if defined(MOJO_CORE_LEGACY_PROTOCOL)
     : Message(capacity, payload_size, max_handles, MessageType::NORMAL_LEGACY) {
 }
 #else
@@ -150,8 +150,8 @@
     mach_ports_header_->num_ports = 0;
     // Initialize all handles to invalid values.
     for (size_t i = 0; i < max_handles_; ++i) {
-      mach_ports_header_->entries[i] =
-          {0, static_cast<uint32_t>(MACH_PORT_NULL)};
+      mach_ports_header_->entries[i] = {0,
+                                        static_cast<uint32_t>(MACH_PORT_NULL)};
     }
 #endif
   }
@@ -415,8 +415,8 @@
   size_t mach_port_index = 0;
   if (mach_ports_header_) {
     for (size_t i = 0; i < max_handles_; ++i) {
-      mach_ports_header_->entries[i] =
-          {0, static_cast<uint32_t>(MACH_PORT_NULL)};
+      mach_ports_header_->entries[i] = {0,
+                                        static_cast<uint32_t>(MACH_PORT_NULL)};
     }
     for (size_t i = 0; i < handle_vector_.size(); i++) {
       if (!handle_vector_[i].is_mach_port_name() &&
@@ -441,8 +441,8 @@
 #if defined(OS_MACOSX) && !defined(OS_IOS)
   if (mach_ports_header_) {
     for (size_t i = 0; i < max_handles_; ++i) {
-      mach_ports_header_->entries[i] =
-          {0, static_cast<uint32_t>(MACH_PORT_NULL)};
+      mach_ports_header_->entries[i] = {0,
+                                        static_cast<uint32_t>(MACH_PORT_NULL)};
     }
     mach_ports_header_->num_ports = 0;
   }
@@ -503,8 +503,8 @@
  public:
   ReadBuffer() {
     size_ = kReadBufferSize;
-    data_ = static_cast<char*>(base::AlignedAlloc(size_,
-                                                  kChannelMessageAlignment));
+    data_ =
+        static_cast<char*>(base::AlignedAlloc(size_, kChannelMessageAlignment));
   }
 
   ~ReadBuffer() {
@@ -600,18 +600,16 @@
 };
 
 Channel::Channel(Delegate* delegate)
-    : delegate_(delegate), read_buffer_(new ReadBuffer) {
-}
+    : delegate_(delegate), read_buffer_(new ReadBuffer) {}
 
-Channel::~Channel() {
-}
+Channel::~Channel() {}
 
 void Channel::ShutDown() {
   ShutDownImpl();
   delegate_ = nullptr;
 }
 
-char* Channel::GetReadBuffer(size_t *buffer_capacity) {
+char* Channel::GetReadBuffer(size_t* buffer_capacity) {
   DCHECK(read_buffer_);
   size_t required_capacity = *buffer_capacity;
   if (!required_capacity)
@@ -621,7 +619,7 @@
   return read_buffer_->Reserve(required_capacity);
 }
 
-bool Channel::OnReadComplete(size_t bytes_read, size_t *next_read_size_hint) {
+bool Channel::OnReadComplete(size_t bytes_read, size_t* next_read_size_hint) {
   bool did_consume_message = false;
   read_buffer_->Claim(bytes_read);
   while (read_buffer_->num_occupied_bytes() >= sizeof(Message::LegacyHeader)) {
@@ -736,5 +734,5 @@
   return false;
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/channel.h b/mojo/core/channel.h
similarity index 96%
rename from mojo/edk/system/channel.h
rename to mojo/core/channel.h
index 7f505bf..a23af82 100644
--- a/mojo/edk/system/channel.h
+++ b/mojo/core/channel.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 MOJO_EDK_SYSTEM_CHANNEL_H_
-#define MOJO_EDK_SYSTEM_CHANNEL_H_
+#ifndef MOJO_CORE_CHANNEL_H_
+#define MOJO_CORE_CHANNEL_H_
 
 #include <vector>
 
@@ -12,13 +12,13 @@
 #include "base/process/process_handle.h"
 #include "base/task_runner.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/connection_params.h"
-#include "mojo/edk/system/platform_handle_in_transit.h"
-#include "mojo/edk/system/scoped_process_handle.h"
+#include "mojo/core/connection_params.h"
+#include "mojo/core/platform_handle_in_transit.h"
+#include "mojo/core/scoped_process_handle.h"
 #include "mojo/public/cpp/platform/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 const size_t kChannelMessageAlignment = 8;
 
@@ -41,8 +41,8 @@
     enum class MessageType : uint16_t {
       // An old format normal message, that uses the LegacyHeader.
       // Only used on Android and ChromeOS.
-      // TODO(jcivelli): remove legacy support when Arc++ has updated to Mojo
-      //                 with normal versioned messages. crbug.com/695645
+      // TODO(https://crbug.com/695645): remove legacy support when Arc++ has
+      // updated to Mojo with normal versioned messages.
       NORMAL_LEGACY = 0,
 #if defined(OS_MACOSX)
       // A control message containing handles to echo back.
@@ -365,7 +365,7 @@
   DISALLOW_COPY_AND_ASSIGN(Channel);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_CHANNEL_H_
+#endif  // MOJO_CORE_CHANNEL_H_
diff --git a/mojo/edk/system/channel_fuchsia.cc b/mojo/core/channel_fuchsia.cc
similarity index 98%
rename from mojo/edk/system/channel_fuchsia.cc
rename to mojo/core/channel_fuchsia.cc
index 9cb10ab..93f7efa9 100644
--- a/mojo/edk/system/channel_fuchsia.cc
+++ b/mojo/core/channel_fuchsia.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 "mojo/edk/system/channel.h"
+#include "mojo/core/channel.h"
 
 #include <lib/fdio/limits.h>
 #include <lib/fdio/util.h>
@@ -24,10 +24,10 @@
 #include "base/stl_util.h"
 #include "base/synchronization/lock.h"
 #include "base/task_runner.h"
-#include "mojo/edk/system/platform_handle_in_transit.h"
+#include "mojo/core/platform_handle_in_transit.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -283,9 +283,7 @@
   }
 
  private:
-  ~ChannelFuchsia() override {
-    DCHECK(!read_watch_);
-  }
+  ~ChannelFuchsia() override { DCHECK(!read_watch_); }
 
   void StartOnIOThread() {
     DCHECK(!read_watch_);
@@ -407,7 +405,7 @@
 
       if (result != ZX_OK) {
         // TODO(fuchsia): Handle ZX_ERR_SHOULD_WAIT flow-control errors, once
-        // the platform starts generating them. See crbug.com/754084.
+        // the platform starts generating them. See https://crbug.com/754084.
         DLOG_IF(ERROR, result != ZX_ERR_PEER_CLOSED)
             << "WriteNoLock(zx_channel_write): "
             << zx_status_get_string(result);
@@ -465,5 +463,5 @@
                             std::move(io_task_runner));
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/channel_posix.cc b/mojo/core/channel_posix.cc
similarity index 99%
rename from mojo/edk/system/channel_posix.cc
rename to mojo/core/channel_posix.cc
index 59060f4..9fa4a4f 100644
--- a/mojo/edk/system/channel_posix.cc
+++ b/mojo/core/channel_posix.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 "mojo/edk/system/channel.h"
+#include "mojo/core/channel.h"
 
 #include <errno.h>
 #include <sys/socket.h>
@@ -21,7 +21,7 @@
 #include "base/synchronization/lock.h"
 #include "base/task_runner.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/core.h"
+#include "mojo/core/core.h"
 #include "mojo/public/cpp/platform/socket_utils_posix.h"
 
 #if !defined(OS_NACL)
@@ -29,11 +29,11 @@
 #endif
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "mojo/edk/system/mach_port_relay.h"
+#include "mojo/core/mach_port_relay.h"
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -753,5 +753,5 @@
                           io_task_runner);
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/channel_unittest.cc b/mojo/core/channel_unittest.cc
similarity index 98%
rename from mojo/edk/system/channel_unittest.cc
rename to mojo/core/channel_unittest.cc
index 87a8db99..e53cc0ffb 100644
--- a/mojo/edk/system/channel_unittest.cc
+++ b/mojo/core/channel_unittest.cc
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/channel.h"
+#include "mojo/core/channel.h"
 
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/threading/thread.h"
-#include "mojo/edk/system/platform_handle_utils.h"
+#include "mojo/core/platform_handle_utils.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 class TestChannel : public Channel {
@@ -274,5 +274,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/channel_win.cc b/mojo/core/channel_win.cc
similarity index 97%
rename from mojo/edk/system/channel_win.cc
rename to mojo/core/channel_win.cc
index 5573be3..30a1486 100644
--- a/mojo/edk/system/channel_win.cc
+++ b/mojo/core/channel_win.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 "mojo/edk/system/channel.h"
+#include "mojo/core/channel.h"
 
 #include <stdint.h>
 #include <windows.h>
@@ -25,7 +25,7 @@
 #include "base/win/win_util.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -181,8 +181,8 @@
   void ShutDownOnIOThread() {
     base::MessageLoopCurrent::Get()->RemoveDestructionObserver(this);
 
-    // BUG(crbug.com/583525): This function is expected to be called once, and
-    // |handle_| should be valid at this point.
+    // TODO(https://crbug.com/583525): This function is expected to be called
+    // once, and |handle_| should be valid at this point.
     CHECK(handle_.IsValid());
     CancelIo(handle_.Get());
     if (leak_handle_)
@@ -373,5 +373,5 @@
   return new ChannelWin(delegate, std::move(connection_params), io_task_runner);
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/configuration.cc b/mojo/core/configuration.cc
similarity index 78%
rename from mojo/edk/system/configuration.cc
rename to mojo/core/configuration.cc
index f9a5d10..b65612ce 100644
--- a/mojo/edk/system/configuration.cc
+++ b/mojo/core/configuration.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/configuration.h"
+#include "mojo/core/configuration.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace internal {
 
 Configuration g_configuration;
 
 }  // namespace internal
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/configuration.h b/mojo/core/configuration.h
similarity index 62%
rename from mojo/edk/system/configuration.h
rename to mojo/core/configuration.h
index 489d20b..4ba3eeb 100644
--- a/mojo/edk/system/configuration.h
+++ b/mojo/core/configuration.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_CONFIGURATION_H_
-#define MOJO_EDK_SYSTEM_CONFIGURATION_H_
+#ifndef MOJO_CORE_CONFIGURATION_H_
+#define MOJO_CORE_CONFIGURATION_H_
 
-#include "mojo/edk/embedder/configuration.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/embedder/configuration.h"
+#include "mojo/core/system_impl_export.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace internal {
 MOJO_SYSTEM_IMPL_EXPORT extern Configuration g_configuration;
@@ -19,7 +19,7 @@
   return internal::g_configuration;
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_CONFIGURATION_H_
+#endif  // MOJO_CORE_CONFIGURATION_H_
diff --git a/mojo/edk/system/connection_params.cc b/mojo/core/connection_params.cc
similarity index 89%
rename from mojo/edk/system/connection_params.cc
rename to mojo/core/connection_params.cc
index bd64a1c..444c1a1 100644
--- a/mojo/edk/system/connection_params.cc
+++ b/mojo/core/connection_params.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/connection_params.h"
+#include "mojo/core/connection_params.h"
 
 #include <utility>
 
 #include "base/logging.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 ConnectionParams::ConnectionParams() = default;
 
@@ -27,5 +27,5 @@
 ConnectionParams& ConnectionParams::operator=(ConnectionParams&& params) =
     default;
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/connection_params.h b/mojo/core/connection_params.h
similarity index 85%
rename from mojo/edk/system/connection_params.h
rename to mojo/core/connection_params.h
index e435a44..77b4190 100644
--- a/mojo/edk/system/connection_params.h
+++ b/mojo/core/connection_params.h
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_CONNECTION_PARAMS_H_
-#define MOJO_EDK_SYSTEM_CONNECTION_PARAMS_H_
+#ifndef MOJO_CORE_CONNECTION_PARAMS_H_
+#define MOJO_CORE_CONNECTION_PARAMS_H_
 
 #include "base/macros.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/cpp/platform/platform_channel_endpoint.h"
 #include "mojo/public/cpp/platform/platform_channel_server_endpoint.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // A set of parameters used when establishing a connection to another process.
 class MOJO_SYSTEM_IMPL_EXPORT ConnectionParams {
@@ -43,7 +43,7 @@
   DISALLOW_COPY_AND_ASSIGN(ConnectionParams);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_CONNECTION_PARAMS_H_
+#endif  // MOJO_CORE_CONNECTION_PARAMS_H_
diff --git a/mojo/edk/system/core.cc b/mojo/core/core.cc
similarity index 96%
rename from mojo/edk/system/core.cc
rename to mojo/core/core.cc
index dceb004..2917a1d 100644
--- a/mojo/edk/system/core.cc
+++ b/mojo/core/core.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 "mojo/edk/system/core.h"
+#include "mojo/core/core.h"
 
 #include <string.h>
 
@@ -23,27 +23,27 @@
 #include "base/time/time.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/process_error_callback.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/data_pipe_consumer_dispatcher.h"
-#include "mojo/edk/system/data_pipe_producer_dispatcher.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/invitation_dispatcher.h"
-#include "mojo/edk/system/message_pipe_dispatcher.h"
-#include "mojo/edk/system/platform_handle_dispatcher.h"
-#include "mojo/edk/system/platform_handle_utils.h"
-#include "mojo/edk/system/platform_shared_memory_mapping.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/node.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
-#include "mojo/edk/system/user_message_impl.h"
-#include "mojo/edk/system/watcher_dispatcher.h"
+#include "mojo/core/channel.h"
+#include "mojo/core/configuration.h"
+#include "mojo/core/data_pipe_consumer_dispatcher.h"
+#include "mojo/core/data_pipe_producer_dispatcher.h"
+#include "mojo/core/embedder/process_error_callback.h"
+#include "mojo/core/handle_signals_state.h"
+#include "mojo/core/invitation_dispatcher.h"
+#include "mojo/core/message_pipe_dispatcher.h"
+#include "mojo/core/platform_handle_dispatcher.h"
+#include "mojo/core/platform_handle_utils.h"
+#include "mojo/core/platform_shared_memory_mapping.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/name.h"
+#include "mojo/core/ports/node.h"
+#include "mojo/core/request_context.h"
+#include "mojo/core/shared_buffer_dispatcher.h"
+#include "mojo/core/user_message_impl.h"
+#include "mojo/core/watcher_dispatcher.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -84,13 +84,13 @@
           handler, context, error, flags));
 }
 
-// Helper class which is bound to the lifetime of a ProcessErrorCallback
-// generated by the |MojoSendInvitation()| API. When the last reference to the
-// error callback is lost within the EDK, which will happen shortly after a
-// connection to the process is lost, that obviously guarantees that no more
-// invocations of the callback will occur. At that point, the corresponding
-// instance of this object (owned by the callback -- see Core::SendInvitation)
-// will be destroyed.
+// Helper class which is bound to the lifetime of a
+// ProcessErrorCallback generated by the |MojoSendInvitation()|
+// API. When the last reference to the error callback is lost within the EDK,
+// which will happen shortly after a connection to the process is lost, that
+// obviously guarantees that no more invocations of the callback will occur. At
+// that point, the corresponding instance of this object (owned by the callback
+// -- see Core::SendInvitation) will be destroyed.
 class ProcessDisconnectHandler {
  public:
   ProcessDisconnectHandler(scoped_refptr<base::TaskRunner> task_runner,
@@ -139,8 +139,8 @@
     scoped_refptr<base::TaskRunner> io_task_runner =
         node_controller_->io_task_runner();
     io_task_runner->PostTask(FROM_HERE,
-                             base::Bind(&Core::PassNodeControllerToIOThread,
-                                        base::Passed(&node_controller_)));
+                             base::BindOnce(&Core::PassNodeControllerToIOThread,
+                                            base::Passed(&node_controller_)));
   }
   base::trace_event::MemoryDumpManager::GetInstance()
       ->UnregisterAndDeleteDumpProviderSoon(std::move(handles_));
@@ -1484,5 +1484,5 @@
   node_controller.release()->DestroyOnIOThreadShutdown();
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/core.h b/mojo/core/core.h
similarity index 96%
rename from mojo/edk/system/core.h
rename to mojo/core/core.h
index 207da18..6069ff5 100644
--- a/mojo/edk/system/core.h
+++ b/mojo/core/core.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 MOJO_EDK_SYSTEM_CORE_H_
-#define MOJO_EDK_SYSTEM_CORE_H_
+#ifndef MOJO_CORE_CORE_H_
+#define MOJO_CORE_CORE_H_
 
 #include <memory>
 #include <string>
@@ -16,11 +16,11 @@
 #include "base/synchronization/lock.h"
 #include "base/task_runner.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/handle_table.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/handle_signals_state.h"
+#include "mojo/core/handle_table.h"
+#include "mojo/core/node_controller.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/c/system/buffer.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/invitation.h"
@@ -34,7 +34,7 @@
 }
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class MachPortRelay;
 class PlatformSharedMemoryMapping;
@@ -158,9 +158,9 @@
 
   // The following methods are essentially implementations of the Mojo Core
   // functions of the Mojo API, with the C interface translated to C++ by
-  // "mojo/edk/embedder/entrypoints.cc". The best way to understand the contract
-  // of these methods is to look at the header files defining the corresponding
-  // API functions, referenced below.
+  // "mojo/core/embedder/entrypoints.cc". The best way to understand the
+  // contract of these methods is to look at the header files defining the
+  // corresponding API functions, referenced below.
 
   // These methods correspond to the API functions defined in
   // "mojo/public/c/system/functions.h":
@@ -369,7 +369,7 @@
   DISALLOW_COPY_AND_ASSIGN(Core);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_CORE_H_
+#endif  // MOJO_CORE_CORE_H_
diff --git a/mojo/edk/system/core_test_base.cc b/mojo/core/core_test_base.cc
similarity index 94%
rename from mojo/edk/system/core_test_base.cc
rename to mojo/core/core_test_base.cc
index a025a9b..3be60c5 100644
--- a/mojo/edk/system/core_test_base.cc
+++ b/mojo/core/core_test_base.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 "mojo/edk/system/core_test_base.h"
+#include "mojo/core/core_test_base.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -12,13 +12,13 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/user_message_impl.h"
+#include "mojo/core/configuration.h"
+#include "mojo/core/core.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/user_message_impl.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 namespace {
@@ -105,11 +105,9 @@
 
 // CoreTestBase ----------------------------------------------------------------
 
-CoreTestBase::CoreTestBase() {
-}
+CoreTestBase::CoreTestBase() {}
 
-CoreTestBase::~CoreTestBase() {
-}
+CoreTestBase::~CoreTestBase() {}
 
 MojoHandle CoreTestBase::CreateMockHandle(CoreTestBase::MockHandleInfo* info) {
   scoped_refptr<MockDispatcher> dispatcher = MockDispatcher::Create(info);
@@ -135,8 +133,7 @@
       begin_read_data_call_count_(0),
       end_read_data_call_count_(0) {}
 
-CoreTestBase_MockHandleInfo::~CoreTestBase_MockHandleInfo() {
-}
+CoreTestBase_MockHandleInfo::~CoreTestBase_MockHandleInfo() {}
 
 unsigned CoreTestBase_MockHandleInfo::GetCtorCallCount() const {
   base::AutoLock locker(lock_);
@@ -249,5 +246,5 @@
 }
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/core_test_base.h b/mojo/core/core_test_base.h
similarity index 91%
rename from mojo/edk/system/core_test_base.h
rename to mojo/core/core_test_base.h
index 84718be..5d37d25 100644
--- a/mojo/edk/system/core_test_base.h
+++ b/mojo/core/core_test_base.h
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_CORE_TEST_BASE_H_
-#define MOJO_EDK_SYSTEM_CORE_TEST_BASE_H_
+#ifndef MOJO_CORE_CORE_TEST_BASE_H_
+#define MOJO_CORE_CORE_TEST_BASE_H_
 
 #include <stddef.h>
 
 #include "base/macros.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/test_utils.h"
+#include "mojo/core/test_utils.h"
 #include "mojo/public/c/system/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class Core;
 
@@ -87,7 +87,7 @@
 };
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_CORE_TEST_BASE_H_
+#endif  // MOJO_CORE_CORE_TEST_BASE_H_
diff --git a/mojo/edk/system/core_unittest.cc b/mojo/core/core_unittest.cc
similarity index 98%
rename from mojo/edk/system/core_unittest.cc
rename to mojo/core/core_unittest.cc
index a35208b..66cf974f 100644
--- a/mojo/edk/system/core_unittest.cc
+++ b/mojo/core/core_unittest.cc
@@ -2,15 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/core.h"
+#include "mojo/core/core.h"
 
 #include <stdint.h>
 
 #include <limits>
 
 #include "base/bind.h"
-#include "mojo/edk/system/core_test_base.h"
-#include "mojo/edk/system/test_utils.h"
+#include "build/build_config.h"
+#include "mojo/core/core_test_base.h"
+#include "mojo/core/test_utils.h"
 #include "mojo/public/cpp/system/wait.h"
 
 #if defined(OS_WIN)
@@ -18,7 +19,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u};
@@ -455,5 +456,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.cc b/mojo/core/data_pipe_consumer_dispatcher.cc
similarity index 97%
rename from mojo/edk/system/data_pipe_consumer_dispatcher.cc
rename to mojo/core/data_pipe_consumer_dispatcher.cc
index 9e98ca8..68e2f7e 100644
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.cc
+++ b/mojo/core/data_pipe_consumer_dispatcher.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 "mojo/edk/system/data_pipe_consumer_dispatcher.h"
+#include "mojo/core/data_pipe_consumer_dispatcher.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -14,16 +14,16 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/data_pipe_control_message.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/platform_handle_utils.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/user_message_impl.h"
+#include "mojo/core/core.h"
+#include "mojo/core/data_pipe_control_message.h"
+#include "mojo/core/node_controller.h"
+#include "mojo/core/platform_handle_utils.h"
+#include "mojo/core/request_context.h"
+#include "mojo/core/user_message_impl.h"
 #include "mojo/public/c/system/data_pipe.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -590,5 +590,5 @@
   }
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.h b/mojo/core/data_pipe_consumer_dispatcher.h
similarity index 90%
rename from mojo/edk/system/data_pipe_consumer_dispatcher.h
rename to mojo/core/data_pipe_consumer_dispatcher.h
index 3e0ca59..982d3f0 100644
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.h
+++ b/mojo/core/data_pipe_consumer_dispatcher.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 MOJO_EDK_SYSTEM_DATA_PIPE_CONSUMER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_DATA_PIPE_CONSUMER_DISPATCHER_H_
+#ifndef MOJO_CORE_DATA_PIPE_CONSUMER_DISPATCHER_H_
+#define MOJO_CORE_DATA_PIPE_CONSUMER_DISPATCHER_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -15,13 +15,13 @@
 #include "base/memory/shared_memory_mapping.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watcher_set.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/ports/port_ref.h"
+#include "mojo/core/system_impl_export.h"
+#include "mojo/core/watcher_set.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class NodeController;
 
@@ -122,7 +122,7 @@
   DISALLOW_COPY_AND_ASSIGN(DataPipeConsumerDispatcher);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_DATA_PIPE_CONSUMER_DISPATCHER_H_
+#endif  // MOJO_CORE_DATA_PIPE_CONSUMER_DISPATCHER_H_
diff --git a/mojo/edk/system/data_pipe_control_message.cc b/mojo/core/data_pipe_control_message.cc
similarity index 82%
rename from mojo/edk/system/data_pipe_control_message.cc
rename to mojo/core/data_pipe_control_message.cc
index 9c0be7c..cd782e5 100644
--- a/mojo/edk/system/data_pipe_control_message.cc
+++ b/mojo/core/data_pipe_control_message.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/data_pipe_control_message.h"
+#include "mojo/core/data_pipe_control_message.h"
 
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/user_message_impl.h"
+#include "mojo/core/node_controller.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/user_message_impl.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 void SendDataPipeControlMessage(NodeController* node_controller,
                                 const ports::PortRef& port,
@@ -33,5 +33,5 @@
   }
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_control_message.h b/mojo/core/data_pipe_control_message.h
similarity index 78%
rename from mojo/edk/system/data_pipe_control_message.h
rename to mojo/core/data_pipe_control_message.h
index 19e218f..3493e2b 100644
--- a/mojo/edk/system/data_pipe_control_message.h
+++ b/mojo/core/data_pipe_control_message.h
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_DATA_PIPE_CONTROL_MESSAGE_H_
-#define MOJO_EDK_SYSTEM_DATA_PIPE_CONTROL_MESSAGE_H_
+#ifndef MOJO_CORE_DATA_PIPE_CONTROL_MESSAGE_H_
+#define MOJO_CORE_DATA_PIPE_CONTROL_MESSAGE_H_
 
 #include <stdint.h>
 
 #include <memory>
 
-#include "mojo/edk/system/ports/port_ref.h"
+#include "mojo/core/ports/port_ref.h"
 #include "mojo/public/c/system/macros.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class NodeController;
 
@@ -36,7 +36,7 @@
                                 DataPipeCommand command,
                                 uint32_t num_bytes);
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_DATA_PIPE_CONTROL_MESSAGE_H_
+#endif  // MOJO_CORE_DATA_PIPE_CONTROL_MESSAGE_H_
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.cc b/mojo/core/data_pipe_producer_dispatcher.cc
similarity index 97%
rename from mojo/edk/system/data_pipe_producer_dispatcher.cc
rename to mojo/core/data_pipe_producer_dispatcher.cc
index e10db6bb..e6256f8 100644
--- a/mojo/edk/system/data_pipe_producer_dispatcher.cc
+++ b/mojo/core/data_pipe_producer_dispatcher.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 "mojo/edk/system/data_pipe_producer_dispatcher.h"
+#include "mojo/core/data_pipe_producer_dispatcher.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -12,17 +12,17 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/data_pipe_control_message.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/platform_handle_utils.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/user_message_impl.h"
+#include "mojo/core/configuration.h"
+#include "mojo/core/core.h"
+#include "mojo/core/data_pipe_control_message.h"
+#include "mojo/core/node_controller.h"
+#include "mojo/core/platform_handle_utils.h"
+#include "mojo/core/request_context.h"
+#include "mojo/core/user_message_impl.h"
 #include "mojo/public/c/system/data_pipe.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -534,5 +534,5 @@
   }
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.h b/mojo/core/data_pipe_producer_dispatcher.h
similarity index 90%
rename from mojo/edk/system/data_pipe_producer_dispatcher.h
rename to mojo/core/data_pipe_producer_dispatcher.h
index 2500d754..15cd1c9 100644
--- a/mojo/edk/system/data_pipe_producer_dispatcher.h
+++ b/mojo/core/data_pipe_producer_dispatcher.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 MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
+#ifndef MOJO_CORE_DATA_PIPE_PRODUCER_DISPATCHER_H_
+#define MOJO_CORE_DATA_PIPE_PRODUCER_DISPATCHER_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -15,13 +15,13 @@
 #include "base/memory/shared_memory_mapping.h"
 #include "base/memory/unsafe_shared_memory_region.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watcher_set.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/ports/port_ref.h"
+#include "mojo/core/system_impl_export.h"
+#include "mojo/core/watcher_set.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class NodeController;
 
@@ -113,7 +113,7 @@
   DISALLOW_COPY_AND_ASSIGN(DataPipeProducerDispatcher);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_DATA_PIPE_PRODUCER_DISPATCHER_H_
+#endif  // MOJO_CORE_DATA_PIPE_PRODUCER_DISPATCHER_H_
diff --git a/mojo/edk/system/data_pipe_unittest.cc b/mojo/core/data_pipe_unittest.cc
similarity index 99%
rename from mojo/edk/system/data_pipe_unittest.cc
rename to mojo/core/data_pipe_unittest.cc
index a5d8a32..b2f32a4 100644
--- a/mojo/edk/system/data_pipe_unittest.cc
+++ b/mojo/core/data_pipe_unittest.cc
@@ -13,9 +13,10 @@
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
+#include "build/build_config.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/test/mojo_test_base.h"
+#include "mojo/core/test_utils.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/functions.h"
 #include "mojo/public/c/system/message_pipe.h"
@@ -24,7 +25,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 const uint32_t kSizeOfOptions =
@@ -2042,5 +2043,5 @@
 #endif  // !defined(OS_IOS)
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/dispatcher.cc b/mojo/core/dispatcher.cc
similarity index 92%
rename from mojo/edk/system/dispatcher.cc
rename to mojo/core/dispatcher.cc
index 58e3ade..49cfe18 100644
--- a/mojo/edk/system/dispatcher.cc
+++ b/mojo/core/dispatcher.cc
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/dispatcher.h"
+#include "mojo/core/dispatcher.h"
 
 #include "base/logging.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/data_pipe_consumer_dispatcher.h"
-#include "mojo/edk/system/data_pipe_producer_dispatcher.h"
-#include "mojo/edk/system/message_pipe_dispatcher.h"
-#include "mojo/edk/system/platform_handle_dispatcher.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
+#include "mojo/core/configuration.h"
+#include "mojo/core/data_pipe_consumer_dispatcher.h"
+#include "mojo/core/data_pipe_producer_dispatcher.h"
+#include "mojo/core/message_pipe_dispatcher.h"
+#include "mojo/core/platform_handle_dispatcher.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/shared_buffer_dispatcher.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 Dispatcher::DispatcherInTransit::DispatcherInTransit() {}
 
@@ -186,5 +186,5 @@
 
 Dispatcher::~Dispatcher() {}
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/dispatcher.h b/mojo/core/dispatcher.h
similarity index 95%
rename from mojo/edk/system/dispatcher.h
rename to mojo/core/dispatcher.h
index 0a1e433..6402f3e 100644
--- a/mojo/edk/system/dispatcher.h
+++ b/mojo/core/dispatcher.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 MOJO_EDK_SYSTEM_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_DISPATCHER_H_
+#ifndef MOJO_CORE_DISPATCHER_H_
+#define MOJO_CORE_DISPATCHER_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -16,11 +16,11 @@
 #include "base/memory/ref_counted.h"
 #include "base/strings/string_piece.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watch.h"
+#include "mojo/core/handle_signals_state.h"
+#include "mojo/core/ports/name.h"
+#include "mojo/core/ports/port_ref.h"
+#include "mojo/core/system_impl_export.h"
+#include "mojo/core/watch.h"
 #include "mojo/public/c/system/buffer.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/message_pipe.h"
@@ -29,7 +29,7 @@
 #include "mojo/public/cpp/platform/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace ports {
 class UserMessageEvent;
@@ -222,7 +222,7 @@
   return out << static_cast<int>(type);
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_DISPATCHER_H_
+#endif  // MOJO_CORE_DISPATCHER_H_
diff --git a/mojo/core/embedder/BUILD.gn b/mojo/core/embedder/BUILD.gn
new file mode 100644
index 0000000..47f1c390
--- /dev/null
+++ b/mojo/core/embedder/BUILD.gn
@@ -0,0 +1,29 @@
+# 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.
+
+component("embedder") {
+  output_name = "mojo_core_embedder"
+
+  public = [
+    "configuration.h",
+    "embedder.h",
+    "scoped_ipc_support.h",
+  ]
+
+  sources = [
+    "embedder.cc",
+    "scoped_ipc_support.cc",
+  ]
+
+  defines = [ "IS_MOJO_CORE_EMBEDDER_IMPL" ]
+
+  public_deps = [
+    "//base",
+  ]
+
+  deps = [
+    "//mojo/core:embedder_internal",
+    "//mojo/public/c/system",
+  ]
+}
diff --git a/mojo/core/embedder/README.md b/mojo/core/embedder/README.md
new file mode 100644
index 0000000..7183a63
--- /dev/null
+++ b/mojo/core/embedder/README.md
@@ -0,0 +1,86 @@
+# Mojo Core Embedder API
+This document is a subset of the [Mojo documentation](/mojo/README.md).
+
+[TOC]
+
+## Overview
+
+The Mojo Core Embedder API enables process to initialize and use Mojo for IPC,
+using an implementation of Mojo Core that is statically linked into the
+application. See the note about dynamic linking
+[here](/mojo/README.md#Mojo-Core) for more information about an alternative
+approach to Mojo Core initialization.
+
+**NOTE:** Unless you are introducing a new binary entry point into the system
+(*e.g.,* a new executable with a new `main()` definition), you probably don't
+need to know anything about the Embedder API. Most processes defined in the
+Chrome repo today already fully initialize Mojo Core so that all other public
+Mojo APIs just work out of the box.
+
+## Basic Initialization
+
+As an embedder, initializing Mojo Core requires a single call to
+`mojo::core::Init`:
+
+```
+#include "mojo/core/embedder/embedder.h"
+
+int main(int argc, char** argv) {
+  mojo::core::Init();
+
+  // Now you can create message pipes, write messages, etc
+
+  return 0;
+}
+```
+
+This enables local API calls to work, so message pipes *etc* can be created and
+used. In some cases (particuarly many unit testing scenarios) this is
+sufficient, but to support any actual multiprocess communication (e.g. sending
+or accepting Mojo invitations), a second IPC initialization step is required.
+
+## IPC Initialization
+
+Internal Mojo IPC implementation requires a background `TaskRunner` on which it
+can watch for inbound I/O from other processes. This is configured using a
+`ScopedIPCSupport` object, which keeps IPC support alive through the extent of
+its lifetime.
+
+Typically an application will create a dedicated background thread and give its
+`TaskRunner` to Mojo. Note that in Chromium, we use the existing "IO thread" in
+the browser process and content child processes. In general, any thread used
+for Mojo IPC support must be running a `base::MessageLoop::TYPE_IO` loop.
+
+```
+#include "base/threading/thread.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
+
+int main(int argc, char** argv) {
+  mojo::core::Init();
+
+  base::Thread ipc_thread("ipc!");
+  ipc_thread.StartWithOptions(
+      base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
+
+  // As long as this object is alive, all Mojo API surface relevant to IPC
+  // connections is usable, and message pipes which span a process boundary will
+  // continue to function.
+  mojo::core::ScopedIPCSupport ipc_support(
+      ipc_thread.task_runner(),
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+
+  return 0;
+}
+```
+
+This process is now fully prepared to use Mojo IPC!
+
+Note that all existing process types in Chromium already perform this setup
+very early during startup.
+
+## Connecting Two Processes
+
+Once IPC is initialized, you can bootstrap connections to other processes by
+using the public
+[Invitations API](/mojo/public/cpp/system/README.md#Invitations).
diff --git a/mojo/edk/embedder/configuration.h b/mojo/core/embedder/configuration.h
similarity index 86%
rename from mojo/edk/embedder/configuration.h
rename to mojo/core/embedder/configuration.h
index d02b9995..f4621dc 100644
--- a/mojo/edk/embedder/configuration.h
+++ b/mojo/core/embedder/configuration.h
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_EMBEDDER_CONFIGURATION_H_
-#define MOJO_EDK_EMBEDDER_CONFIGURATION_H_
+#ifndef MOJO_CORE_EMBEDDER_CONFIGURATION_H_
+#define MOJO_CORE_EMBEDDER_CONFIGURATION_H_
 
 #include <stddef.h>
 #include <stdint.h>
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // A set of configuration parameters that the Mojo system uses internally. The
 // configuration used can be overridden from the default by passing a
-// Configuration into |mojo::edk::Init()|. See embedder.h.
+// Configuration into |mojo::core::Init()|. See embedder.h.
 //
 // NOTE: Please ensure that this type remains a simple aggregate of POD fields.
 struct Configuration {
@@ -41,7 +41,7 @@
   size_t max_shared_memory_num_bytes = 1024 * 1024 * 1024;
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_EMBEDDER_CONFIGURATION_H_
+#endif  // MOJO_CORE_EMBEDDER_CONFIGURATION_H_
diff --git a/mojo/edk/embedder/embedder.cc b/mojo/core/embedder/embedder.cc
similarity index 80%
rename from mojo/edk/embedder/embedder.cc
rename to mojo/core/embedder/embedder.cc
index e6473f82..4044de08 100644
--- a/mojo/edk/embedder/embedder.cc
+++ b/mojo/core/embedder/embedder.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 "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 #include <stdint.h>
 #include <utility>
@@ -11,14 +11,15 @@
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/task_runner.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/entrypoints.h"
-#include "mojo/edk/system/node_controller.h"
+#include "build/build_config.h"
+#include "mojo/core/configuration.h"
+#include "mojo/core/core.h"
+#include "mojo/core/entrypoints.h"
+#include "mojo/core/node_controller.h"
 #include "mojo/public/c/system/thunks.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 void Init(const Configuration& configuration) {
   internal::g_configuration = configuration;
@@ -45,5 +46,5 @@
 }
 #endif
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/embedder/embedder.h b/mojo/core/embedder/embedder.h
similarity index 77%
rename from mojo/edk/embedder/embedder.h
rename to mojo/core/embedder/embedder.h
index 572bebb6..feb7ca1b 100644
--- a/mojo/edk/embedder/embedder.h
+++ b/mojo/core/embedder/embedder.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 MOJO_EDK_EMBEDDER_EMBEDDER_H_
-#define MOJO_EDK_EMBEDDER_EMBEDDER_H_
+#ifndef MOJO_CORE_EMBEDDER_EMBEDDER_H_
+#define MOJO_CORE_EMBEDDER_EMBEDDER_H_
 
 #include <stddef.h>
 
@@ -15,14 +15,15 @@
 #include "base/memory/shared_memory_handle.h"
 #include "base/process/process_handle.h"
 #include "base/task_runner.h"
-#include "mojo/edk/embedder/configuration.h"
+#include "build/build_config.h"
+#include "mojo/core/embedder/configuration.h"
 
 namespace base {
 class PortProvider;
 }
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 using ProcessErrorCallback = base::Callback<void(const std::string& error)>;
 
@@ -30,23 +31,23 @@
 
 // Must be called first, or just after setting configuration parameters, to
 // initialize the (global, singleton) system state. There is no corresponding
-// shutdown operation: once the EDK is initialized, public Mojo C API calls
+// shutdown operation: once the embedder is initialized, public Mojo C API calls
 // remain available for the remainder of the process's lifetime.
-COMPONENT_EXPORT(MOJO_EDK_EMBEDDER)
+COMPONENT_EXPORT(MOJO_CORE_EMBEDDER)
 void Init(const Configuration& configuration);
 
 // Like above but uses a default Configuration.
-COMPONENT_EXPORT(MOJO_EDK_EMBEDDER) void Init();
+COMPONENT_EXPORT(MOJO_CORE_EMBEDDER) void Init();
 
 // Sets a default callback to invoke when an internal error is reported but
 // cannot be associated with a specific child process. Calling this is optional.
-COMPONENT_EXPORT(MOJO_EDK_EMBEDDER)
+COMPONENT_EXPORT(MOJO_CORE_EMBEDDER)
 void SetDefaultProcessErrorCallback(const ProcessErrorCallback& callback);
 
 // Initialialization/shutdown for interprocess communication (IPC) -------------
 
 // Retrieves the TaskRunner used for IPC I/O, as set by ScopedIPCSupport.
-COMPONENT_EXPORT(MOJO_EDK_EMBEDDER)
+COMPONENT_EXPORT(MOJO_CORE_EMBEDDER)
 scoped_refptr<base::TaskRunner> GetIOTaskRunner();
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
@@ -54,11 +55,11 @@
 // but must be set in the root process before any Mach ports can be transferred.
 //
 // If called at all, this must be called while a ScopedIPCSupport exists.
-COMPONENT_EXPORT(MOJO_EDK_EMBEDDER)
+COMPONENT_EXPORT(MOJO_CORE_EMBEDDER)
 void SetMachPortProvider(base::PortProvider* port_provider);
 #endif
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_EMBEDDER_EMBEDDER_H_
+#endif  // MOJO_CORE_EMBEDDER_EMBEDDER_H_
diff --git a/mojo/edk/embedder/process_error_callback.h b/mojo/core/embedder/process_error_callback.h
similarity index 63%
rename from mojo/edk/embedder/process_error_callback.h
rename to mojo/core/embedder/process_error_callback.h
index 53234def..f60ce89 100644
--- a/mojo/edk/embedder/process_error_callback.h
+++ b/mojo/core/embedder/process_error_callback.h
@@ -2,20 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_EMBEDDER_PROCESS_ERROR_CALLBACK_H_
-#define MOJO_EDK_EMBEDDER_PROCESS_ERROR_CALLBACK_H_
+#ifndef MOJO_CORE_EMBEDDER_PROCESS_ERROR_CALLBACK_H_
+#define MOJO_CORE_EMBEDDER_PROCESS_ERROR_CALLBACK_H_
 
 #include <string>
 
 #include "base/callback.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 using ProcessErrorCallback =
     base::RepeatingCallback<void(const std::string& error)>;
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_EMBEDDER_PROCESS_ERROR_CALLBACK_H_
+#endif  // MOJO_CORE_EMBEDDER_PROCESS_ERROR_CALLBACK_H_
diff --git a/mojo/edk/embedder/scoped_ipc_support.cc b/mojo/core/embedder/scoped_ipc_support.cc
similarity index 81%
rename from mojo/edk/embedder/scoped_ipc_support.cc
rename to mojo/core/embedder/scoped_ipc_support.cc
index a023172..71174f5 100644
--- a/mojo/edk/embedder/scoped_ipc_support.cc
+++ b/mojo/core/embedder/scoped_ipc_support.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread_restrictions.h"
-#include "mojo/edk/system/core.h"
+#include "mojo/core/core.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -23,7 +23,8 @@
 
 ScopedIPCSupport::ScopedIPCSupport(
     scoped_refptr<base::TaskRunner> io_thread_task_runner,
-    ShutdownPolicy shutdown_policy) : shutdown_policy_(shutdown_policy) {
+    ShutdownPolicy shutdown_policy)
+    : shutdown_policy_(shutdown_policy) {
   Core::Get()->SetIOTaskRunner(io_thread_task_runner);
 }
 
@@ -39,9 +40,9 @@
   ShutdownIPCSupport(base::Bind(&base::WaitableEvent::Signal,
                                 base::Unretained(&shutdown_event)));
 
-  base::ThreadRestrictions::ScopedAllowWait allow_io;
+  base::ScopedAllowBaseSyncPrimitives allow_io;
   shutdown_event.Wait();
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/embedder/scoped_ipc_support.h b/mojo/core/embedder/scoped_ipc_support.h
similarity index 93%
rename from mojo/edk/embedder/scoped_ipc_support.h
rename to mojo/core/embedder/scoped_ipc_support.h
index 0763a789..8afcd00d 100644
--- a/mojo/edk/embedder/scoped_ipc_support.h
+++ b/mojo/core/embedder/scoped_ipc_support.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 MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_
-#define MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_
+#ifndef MOJO_CORE_EMBEDDER_SCOPED_IPC_SUPPORT_H_
+#define MOJO_CORE_EMBEDDER_SCOPED_IPC_SUPPORT_H_
 
 #include "base/component_export.h"
 #include "base/memory/ref_counted.h"
@@ -13,12 +13,12 @@
 }
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // A simple class that initialized Mojo IPC support on construction and shuts
 // down IPC support on destruction, optionally blocking the destructor on clean
 // IPC shutdown completion.
-class COMPONENT_EXPORT(MOJO_EDK_EMBEDDER) ScopedIPCSupport {
+class COMPONENT_EXPORT(MOJO_CORE_EMBEDDER) ScopedIPCSupport {
  public:
   // ShutdownPolicy is a type for specifying the desired Mojo IPC support
   // shutdown behavior used during ScopedIPCSupport destruction.
@@ -32,7 +32,7 @@
   // In order to facilitate efficient and reliable transfer of Mojo message pipe
   // endpoints across process boundaries, the underlying model for a message
   // pipe is actually a self-collapsing cycle of "ports." See
-  // //mojo/edk/system/ports for gritty implementation details.
+  // //mojo/core/ports for gritty implementation details.
   //
   // Ports are essentially globally unique identifiers used for system-wide
   // message routing. Every message pipe consists of at least two such ports:
@@ -112,7 +112,7 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedIPCSupport);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_EMBEDDER_SCOPED_IPC_SUPPORT_H_
+#endif  // MOJO_CORE_EMBEDDER_SCOPED_IPC_SUPPORT_H_
diff --git a/mojo/edk/system/embedder_unittest.cc b/mojo/core/embedder_unittest.cc
similarity index 97%
rename from mojo/edk/system/embedder_unittest.cc
rename to mojo/core/embedder_unittest.cc
index ae9fb26..7e8a227 100644
--- a/mojo/edk/system/embedder_unittest.cc
+++ b/mojo/core/embedder_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 "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -29,10 +29,10 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/test/test_timeouts.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
+#include "mojo/core/core.h"
+#include "mojo/core/shared_buffer_dispatcher.h"
+#include "mojo/core/test/mojo_test_base.h"
+#include "mojo/core/test_utils.h"
 #include "mojo/public/c/system/core.h"
 #include "mojo/public/cpp/system/handle.h"
 #include "mojo/public/cpp/system/message_pipe.h"
@@ -41,7 +41,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 template <typename T>
@@ -423,5 +423,5 @@
 #endif  // !defined(OS_IOS)
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/entrypoints.cc b/mojo/core/entrypoints.cc
similarity index 98%
rename from mojo/edk/system/entrypoints.cc
rename to mojo/core/entrypoints.cc
index 41aa67ae..2e67a680 100644
--- a/mojo/edk/system/entrypoints.cc
+++ b/mojo/core/entrypoints.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/entrypoints.h"
+#include "mojo/core/entrypoints.h"
 
 #include <stdint.h>
 
-#include "mojo/edk/system/core.h"
+#include "mojo/core/core.h"
 #include "mojo/public/c/system/buffer.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/functions.h"
@@ -15,7 +15,7 @@
 
 namespace {
 
-mojo::edk::Core* g_core;
+mojo::core::Core* g_core;
 
 extern "C" {
 
@@ -378,7 +378,7 @@
 }  // namespace
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // static
 Core* Core::Get() {
@@ -393,5 +393,5 @@
   return g_thunks;
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/entrypoints.h b/mojo/core/entrypoints.h
similarity index 73%
rename from mojo/edk/system/entrypoints.h
rename to mojo/core/entrypoints.h
index 016a024..e18366b7 100644
--- a/mojo/edk/system/entrypoints.h
+++ b/mojo/core/entrypoints.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_ENTRYPOINTS_H_
-#define MOJO_EDK_SYSTEM_ENTRYPOINTS_H_
+#ifndef MOJO_CORE_ENTRYPOINTS_H_
+#define MOJO_CORE_ENTRYPOINTS_H_
 
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/c/system/thunks.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // Initializes the global Core object.
 MOJO_SYSTEM_IMPL_EXPORT void InitializeCore();
@@ -19,7 +19,7 @@
 // application loading.
 MOJO_SYSTEM_IMPL_EXPORT const MojoSystemThunks& GetSystemThunks();
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_ENTRYPOINTS_H_
+#endif  // MOJO_CORE_ENTRYPOINTS_H_
diff --git a/mojo/edk/export_only_thunks_api.lst b/mojo/core/export_only_thunks_api.lst
similarity index 100%
rename from mojo/edk/export_only_thunks_api.lst
rename to mojo/core/export_only_thunks_api.lst
diff --git a/mojo/edk/system/handle_signals_state.h b/mojo/core/handle_signals_state.h
similarity index 93%
rename from mojo/edk/system/handle_signals_state.h
rename to mojo/core/handle_signals_state.h
index c8c5b5ea..755f7c9 100644
--- a/mojo/edk/system/handle_signals_state.h
+++ b/mojo/core/handle_signals_state.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_HANDLE_SIGNALS_STATE_H_
-#define MOJO_EDK_SYSTEM_HANDLE_SIGNALS_STATE_H_
+#ifndef MOJO_CORE_HANDLE_SIGNALS_STATE_H_
+#define MOJO_CORE_HANDLE_SIGNALS_STATE_H_
 
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/c/system/types.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // A convenience wrapper around the MojoHandleSignalsState struct.
 //
@@ -100,7 +100,7 @@
 static_assert(sizeof(HandleSignalsState) == sizeof(MojoHandleSignalsState),
               "HandleSignalsState should add no overhead");
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_HANDLE_SIGNALS_STATE_H_
+#endif  // MOJO_CORE_HANDLE_SIGNALS_STATE_H_
diff --git a/mojo/edk/system/handle_table.cc b/mojo/core/handle_table.cc
similarity index 97%
rename from mojo/edk/system/handle_table.cc
rename to mojo/core/handle_table.cc
index 107d45f..62419a923 100644
--- a/mojo/edk/system/handle_table.cc
+++ b/mojo/core/handle_table.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 "mojo/edk/system/handle_table.h"
+#include "mojo/core/handle_table.h"
 
 #include <stdint.h>
 
@@ -11,7 +11,7 @@
 #include "base/trace_event/memory_dump_manager.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -40,11 +40,9 @@
 
 }  // namespace
 
-HandleTable::HandleTable() {
-}
+HandleTable::HandleTable() {}
 
-HandleTable::~HandleTable() {
-}
+HandleTable::~HandleTable() {}
 
 base::Lock& HandleTable::GetLock() {
   return lock_;
@@ -202,5 +200,5 @@
 
 HandleTable::Entry::~Entry() {}
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/handle_table.h b/mojo/core/handle_table.h
similarity index 82%
rename from mojo/edk/system/handle_table.h
rename to mojo/core/handle_table.h
index f8206cf..234bdac 100644
--- a/mojo/edk/system/handle_table.h
+++ b/mojo/core/handle_table.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 MOJO_EDK_SYSTEM_HANDLE_TABLE_H_
-#define MOJO_EDK_SYSTEM_HANDLE_TABLE_H_
+#ifndef MOJO_CORE_HANDLE_TABLE_H_
+#define MOJO_CORE_HANDLE_TABLE_H_
 
 #include <stdint.h>
 
@@ -14,12 +14,12 @@
 #include "base/macros.h"
 #include "base/synchronization/lock.h"
 #include "base/trace_event/memory_dump_provider.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/c/system/types.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class MOJO_SYSTEM_IMPL_EXPORT HandleTable
     : public base::trace_event::MemoryDumpProvider {
@@ -55,7 +55,7 @@
   void CancelTransit(
       const std::vector<Dispatcher::DispatcherInTransit>& dispatchers);
 
-  void GetActiveHandlesForTest(std::vector<MojoHandle> *handles);
+  void GetActiveHandlesForTest(std::vector<MojoHandle>* handles);
 
  private:
   FRIEND_TEST_ALL_PREFIXES(HandleTableTest, OnMemoryDump);
@@ -65,13 +65,13 @@
                     base::trace_event::ProcessMemoryDump* pmd) override;
 
   struct Entry {
-   Entry();
-   explicit Entry(scoped_refptr<Dispatcher> dispatcher);
-   Entry(const Entry& other);
-   ~Entry();
+    Entry();
+    explicit Entry(scoped_refptr<Dispatcher> dispatcher);
+    Entry(const Entry& other);
+    ~Entry();
 
-   scoped_refptr<Dispatcher> dispatcher;
-   bool busy = false;
+    scoped_refptr<Dispatcher> dispatcher;
+    bool busy = false;
   };
 
   using HandleMap = base::hash_map<MojoHandle, Entry>;
@@ -84,7 +84,7 @@
   DISALLOW_COPY_AND_ASSIGN(HandleTable);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_HANDLE_TABLE_H_
+#endif  // MOJO_CORE_HANDLE_TABLE_H_
diff --git a/mojo/edk/system/handle_table_unittest.cc b/mojo/core/handle_table_unittest.cc
similarity index 89%
rename from mojo/edk/system/handle_table_unittest.cc
rename to mojo/core/handle_table_unittest.cc
index 475a7b9..493f71e 100644
--- a/mojo/edk/system/handle_table_unittest.cc
+++ b/mojo/core/handle_table_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 "mojo/edk/system/handle_table.h"
+#include "mojo/core/handle_table.h"
 
 #include <memory>
 
@@ -11,7 +11,7 @@
 #include "base/trace_event/memory_dump_request_args.h"
 #include "base/trace_event/process_memory_dump.h"
 #include "base/trace_event/trace_event_argument.h"
-#include "mojo/edk/system/dispatcher.h"
+#include "mojo/core/dispatcher.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -22,7 +22,7 @@
 using testing::ByRef;
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 class FakeMessagePipeDispatcher : public Dispatcher {
@@ -56,8 +56,7 @@
 
   {
     base::AutoLock auto_lock(ht.GetLock());
-    scoped_refptr<mojo::edk::Dispatcher> dispatcher(
-        new FakeMessagePipeDispatcher);
+    scoped_refptr<Dispatcher> dispatcher(new FakeMessagePipeDispatcher);
     ht.AddDispatcher(dispatcher);
   }
 
@@ -70,5 +69,5 @@
   CheckNameAndValue(&pmd, "mojo/data_pipe_consumer", 0);
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/invitation_dispatcher.cc b/mojo/core/invitation_dispatcher.cc
similarity index 93%
rename from mojo/edk/system/invitation_dispatcher.cc
rename to mojo/core/invitation_dispatcher.cc
index aa684bc..82d33871 100644
--- a/mojo/edk/system/invitation_dispatcher.cc
+++ b/mojo/core/invitation_dispatcher.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/invitation_dispatcher.h"
+#include "mojo/core/invitation_dispatcher.h"
 
-#include "mojo/edk/system/core.h"
+#include "mojo/core/core.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 InvitationDispatcher::InvitationDispatcher() = default;
 
@@ -74,5 +74,5 @@
   DCHECK(is_closed_);
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/invitation_dispatcher.h b/mojo/core/invitation_dispatcher.h
similarity index 77%
rename from mojo/edk/system/invitation_dispatcher.h
rename to mojo/core/invitation_dispatcher.h
index 24dab09f..c856e1f 100644
--- a/mojo/edk/system/invitation_dispatcher.h
+++ b/mojo/core/invitation_dispatcher.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 MOJO_EDK_SYSTEM_INVITATION_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_INVITATION_DISPATCHER_H_
+#ifndef MOJO_CORE_INVITATION_DISPATCHER_H_
+#define MOJO_CORE_INVITATION_DISPATCHER_H_
 
 #include <stdint.h>
 
@@ -11,12 +11,12 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/ports/port_ref.h"
+#include "mojo/core/system_impl_export.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class MOJO_SYSTEM_IMPL_EXPORT InvitationDispatcher : public Dispatcher {
  public:
@@ -43,7 +43,7 @@
   DISALLOW_COPY_AND_ASSIGN(InvitationDispatcher);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_INVITATION_DISPATCHER_H
+#endif  // MOJO_CORE_INVITATION_DISPATCHER_H
diff --git a/mojo/edk/system/invitation_unittest.cc b/mojo/core/invitation_unittest.cc
similarity index 99%
rename from mojo/edk/system/invitation_unittest.cc
rename to mojo/core/invitation_unittest.cc
index 53bfe6e..791bb08 100644
--- a/mojo/edk/system/invitation_unittest.cc
+++ b/mojo/core/invitation_unittest.cc
@@ -20,14 +20,14 @@
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "build/build_config.h"
-#include "mojo/edk/test/mojo_test_base.h"
+#include "mojo/core/test/mojo_test_base.h"
 #include "mojo/public/c/system/invitation.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 enum class TransportType {
@@ -870,5 +870,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/mach_port_relay.cc b/mojo/core/mach_port_relay.cc
similarity index 98%
rename from mojo/edk/system/mach_port_relay.cc
rename to mojo/core/mach_port_relay.cc
index 208d2dc3..7d7a425 100644
--- a/mojo/edk/system/mach_port_relay.cc
+++ b/mojo/core/mach_port_relay.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 "mojo/edk/system/mach_port_relay.h"
+#include "mojo/core/mach_port_relay.h"
 
 #include <mach/mach.h>
 
@@ -15,7 +15,7 @@
 #include "base/process/process.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -196,5 +196,5 @@
     observer->OnProcessReady(process);
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/mach_port_relay.h b/mojo/core/mach_port_relay.h
similarity index 93%
rename from mojo/edk/system/mach_port_relay.h
rename to mojo/core/mach_port_relay.h
index 37b98ba..4cb6de4 100644
--- a/mojo/edk/system/mach_port_relay.h
+++ b/mojo/core/mach_port_relay.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 MOJO_EDK_SYSTEM_MACH_PORT_RELAY_H_
-#define MOJO_EDK_SYSTEM_MACH_PORT_RELAY_H_
+#ifndef MOJO_CORE_MACH_PORT_RELAY_H_
+#define MOJO_CORE_MACH_PORT_RELAY_H_
 
 #include <set>
 #include <vector>
@@ -11,10 +11,10 @@
 #include "base/macros.h"
 #include "base/process/port_provider_mac.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/channel.h"
+#include "mojo/core/channel.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // The MachPortRelay is used by a privileged process, usually the root process,
 // to manipulate Mach ports in a child process. Ports can be added to and
@@ -84,7 +84,7 @@
   DISALLOW_COPY_AND_ASSIGN(MachPortRelay);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_MACH_PORT_RELAY_H_
+#endif  // MOJO_CORE_MACH_PORT_RELAY_H_
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/core/message_pipe_dispatcher.cc
similarity index 96%
rename from mojo/edk/system/message_pipe_dispatcher.cc
rename to mojo/core/message_pipe_dispatcher.cc
index 3063d87..b7535c7e 100644
--- a/mojo/edk/system/message_pipe_dispatcher.cc
+++ b/mojo/core/message_pipe_dispatcher.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 "mojo/edk/system/message_pipe_dispatcher.h"
+#include "mojo/core/message_pipe_dispatcher.h"
 
 #include <limits>
 #include <memory>
@@ -10,15 +10,15 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/message_filter.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/user_message_impl.h"
+#include "mojo/core/core.h"
+#include "mojo/core/node_controller.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/message_filter.h"
+#include "mojo/core/request_context.h"
+#include "mojo/core/user_message_impl.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -364,5 +364,5 @@
   watchers_.NotifyState(GetHandleSignalsStateNoLock());
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/message_pipe_dispatcher.h b/mojo/core/message_pipe_dispatcher.h
similarity index 90%
rename from mojo/edk/system/message_pipe_dispatcher.h
rename to mojo/core/message_pipe_dispatcher.h
index 0c252a5d..c1f1d55 100644
--- a/mojo/edk/system/message_pipe_dispatcher.h
+++ b/mojo/core/message_pipe_dispatcher.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 MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_
+#ifndef MOJO_CORE_MESSAGE_PIPE_DISPATCHER_H_
+#define MOJO_CORE_MESSAGE_PIPE_DISPATCHER_H_
 
 #include <stdint.h>
 
@@ -11,13 +11,13 @@
 #include <queue>
 
 #include "base/macros.h"
-#include "mojo/edk/system/atomic_flag.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/watcher_set.h"
+#include "mojo/core/atomic_flag.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/ports/port_ref.h"
+#include "mojo/core/watcher_set.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class NodeController;
 
@@ -103,7 +103,7 @@
   DISALLOW_COPY_AND_ASSIGN(MessagePipeDispatcher);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_MESSAGE_PIPE_DISPATCHER_H_
+#endif  // MOJO_CORE_MESSAGE_PIPE_DISPATCHER_H_
diff --git a/mojo/edk/system/message_pipe_perftest.cc b/mojo/core/message_pipe_perftest.cc
similarity index 94%
rename from mojo/edk/system/message_pipe_perftest.cc
rename to mojo/core/message_pipe_perftest.cc
index 3e26742..93c833a5 100644
--- a/mojo/edk/system/message_pipe_perftest.cc
+++ b/mojo/core/message_pipe_perftest.cc
@@ -15,17 +15,17 @@
 #include "base/strings/stringprintf.h"
 #include "base/test/perf_time_logger.h"
 #include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/edk/test/test_utils.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/handle_signals_state.h"
+#include "mojo/core/test/mojo_test_base.h"
+#include "mojo/core/test/test_utils.h"
+#include "mojo/core/test_utils.h"
 #include "mojo/public/c/system/functions.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 class MessagePipePerfTest : public test::MojoTestBase {
@@ -157,5 +157,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/message_pipe_unittest.cc b/mojo/core/message_pipe_unittest.cc
similarity index 98%
rename from mojo/edk/system/message_pipe_unittest.cc
rename to mojo/core/message_pipe_unittest.cc
index 2cdc58e..7f77b32 100644
--- a/mojo/edk/system/message_pipe_unittest.cc
+++ b/mojo/core/message_pipe_unittest.cc
@@ -12,14 +12,15 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
+#include "build/build_config.h"
+#include "mojo/core/test/mojo_test_base.h"
+#include "mojo/core/test_utils.h"
 #include "mojo/public/c/system/core.h"
 #include "mojo/public/c/system/types.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 const MojoHandleSignals kAllSignals =
@@ -555,5 +556,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/message_unittest.cc b/mojo/core/message_unittest.cc
similarity index 99%
rename from mojo/edk/system/message_unittest.cc
rename to mojo/core/message_unittest.cc
index 29c1cbe..ce44f22 100644
--- a/mojo/edk/system/message_unittest.cc
+++ b/mojo/core/message_unittest.cc
@@ -11,15 +11,15 @@
 #include "base/numerics/safe_math.h"
 #include "base/rand_util.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/user_message_impl.h"
-#include "mojo/edk/test/mojo_test_base.h"
+#include "mojo/core/test/mojo_test_base.h"
+#include "mojo/core/user_message_impl.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/system/buffer.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 using MessageTest = test::MojoTestBase;
@@ -952,5 +952,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/mojo_core.cc b/mojo/core/mojo_core.cc
similarity index 86%
rename from mojo/edk/mojo_core.cc
rename to mojo/core/mojo_core.cc
index 658d526..9823b201 100644
--- a/mojo/edk/mojo_core.cc
+++ b/mojo/core/mojo_core.cc
@@ -3,8 +3,8 @@
 // found in the LICENSE file.
 
 #include "base/time/time.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/entrypoints.h"
+#include "mojo/core/core.h"
+#include "mojo/core/entrypoints.h"
 #include "mojo/public/c/system/core.h"
 #include "mojo/public/c/system/thunks.h"
 
@@ -13,7 +13,7 @@
 namespace {
 
 MojoResult InitializeImpl(const struct MojoInitializeOptions* options) {
-  mojo::edk::InitializeCore();
+  mojo::core::InitializeCore();
   return MOJO_RESULT_OK;
 }
 
@@ -29,7 +29,7 @@
 
 EXPORT_FROM_MOJO_CORE void MojoGetSystemThunks(MojoSystemThunks* thunks) {
   if (!g_thunks.size) {
-    g_thunks = mojo::edk::GetSystemThunks();
+    g_thunks = mojo::core::GetSystemThunks();
     g_thunks.Initialize = InitializeImpl;
   }
 
diff --git a/mojo/edk/mojo_core.def b/mojo/core/mojo_core.def
similarity index 100%
rename from mojo/edk/mojo_core.def
rename to mojo/core/mojo_core.def
diff --git a/mojo/edk/mojo_core_unittest.cc b/mojo/core/mojo_core_unittest.cc
similarity index 100%
rename from mojo/edk/mojo_core_unittest.cc
rename to mojo/core/mojo_core_unittest.cc
diff --git a/mojo/edk/system/multiprocess_message_pipe_unittest.cc b/mojo/core/multiprocess_message_pipe_unittest.cc
similarity index 99%
rename from mojo/edk/system/multiprocess_message_pipe_unittest.cc
rename to mojo/core/multiprocess_message_pipe_unittest.cc
index 572a2d75e..3280a46 100644
--- a/mojo/edk/system/multiprocess_message_pipe_unittest.cc
+++ b/mojo/core/multiprocess_message_pipe_unittest.cc
@@ -22,10 +22,10 @@
 #include "base/run_loop.h"
 #include "base/strings/string_split.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/test_utils.h"
-#include "mojo/edk/test/mojo_test_base.h"
-#include "mojo/edk/test/test_utils.h"
+#include "mojo/core/handle_signals_state.h"
+#include "mojo/core/test/mojo_test_base.h"
+#include "mojo/core/test/test_utils.h"
+#include "mojo/core/test_utils.h"
 #include "mojo/public/c/system/buffer.h"
 #include "mojo/public/c/system/functions.h"
 #include "mojo/public/c/system/types.h"
@@ -36,7 +36,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 // Temporary helpers to avoid tons of churn as old APIs are removed. These
@@ -1348,5 +1348,5 @@
                     test::MojoTestBase::LaunchType::NAMED_CHILD,
                     test::MojoTestBase::LaunchType::NAMED_PEER));
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/node_channel.cc b/mojo/core/node_channel.cc
similarity index 97%
rename from mojo/edk/system/node_channel.cc
rename to mojo/core/node_channel.cc
index 315610c..ebcb8812 100644
--- a/mojo/edk/system/node_channel.cc
+++ b/mojo/core/node_channel.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 "mojo/edk/system/node_channel.h"
+#include "mojo/core/node_channel.h"
 
 #include <cstring>
 #include <limits>
@@ -12,13 +12,13 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/request_context.h"
+#include "mojo/core/channel.h"
+#include "mojo/core/configuration.h"
+#include "mojo/core/core.h"
+#include "mojo/core/request_context.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -329,9 +329,9 @@
 void NodeChannel::RequestPortMerge(const ports::PortName& connector_port_name,
                                    const std::string& token) {
   RequestPortMergeData* data;
-  Channel::MessagePtr message = CreateMessage(
-      MessageType::REQUEST_PORT_MERGE,
-      sizeof(RequestPortMergeData) + token.size(), 0, &data);
+  Channel::MessagePtr message =
+      CreateMessage(MessageType::REQUEST_PORT_MERGE,
+                    sizeof(RequestPortMergeData) + token.size(), 0, &data);
   data->connector_port_name = connector_port_name;
   memcpy(data + 1, token.data(), token.size());
   WriteChannelMessage(std::move(message));
@@ -625,9 +625,9 @@
           DLOG(ERROR) << "Dropping invalid relay message.";
           break;
         }
-  #if defined(OS_MACOSX) && !defined(OS_IOS)
+#if defined(OS_MACOSX) && !defined(OS_IOS)
         message->SetHandles(std::move(handles));
-  #endif
+#endif
         delegate_->OnRelayEventMessage(remote_node_name_, from_process,
                                        data->destination, std::move(message));
         return;
@@ -727,5 +727,5 @@
     channel_->Write(std::move(message));
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/node_channel.h b/mojo/core/node_channel.h
similarity index 95%
rename from mojo/edk/system/node_channel.h
rename to mojo/core/node_channel.h
index cec96fb..55733050 100644
--- a/mojo/edk/system/node_channel.h
+++ b/mojo/core/node_channel.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 MOJO_EDK_SYSTEM_NODE_CHANNEL_H_
-#define MOJO_EDK_SYSTEM_NODE_CHANNEL_H_
+#ifndef MOJO_CORE_NODE_CHANNEL_H_
+#define MOJO_CORE_NODE_CHANNEL_H_
 
 #include <utility>
 #include <vector>
@@ -16,14 +16,14 @@
 #include "base/synchronization/lock.h"
 #include "base/task_runner.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/process_error_callback.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/connection_params.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/scoped_process_handle.h"
+#include "mojo/core/channel.h"
+#include "mojo/core/connection_params.h"
+#include "mojo/core/embedder/process_error_callback.h"
+#include "mojo/core/ports/name.h"
+#include "mojo/core/scoped_process_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // Wraps a Channel to send and receive Node control messages.
 class NodeChannel : public base::RefCountedThreadSafe<NodeChannel>,
@@ -182,7 +182,7 @@
   DISALLOW_COPY_AND_ASSIGN(NodeChannel);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_NODE_CHANNEL_H_
+#endif  // MOJO_CORE_NODE_CHANNEL_H_
diff --git a/mojo/edk/system/node_controller.cc b/mojo/core/node_controller.cc
similarity index 97%
rename from mojo/edk/system/node_controller.cc
rename to mojo/core/node_controller.cc
index 9af0caad..fc65c4d5 100644
--- a/mojo/edk/system/node_controller.cc
+++ b/mojo/core/node_controller.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 "mojo/edk/system/node_controller.h"
+#include "mojo/core/node_controller.h"
 
 #include <algorithm>
 #include <limits>
@@ -19,12 +19,12 @@
 #include "base/rand_util.h"
 #include "base/time/time.h"
 #include "base/timer/elapsed_timer.h"
-#include "mojo/edk/system/broker.h"
-#include "mojo/edk/system/broker_host.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/user_message_impl.h"
+#include "mojo/core/broker.h"
+#include "mojo/core/broker_host.h"
+#include "mojo/core/configuration.h"
+#include "mojo/core/core.h"
+#include "mojo/core/request_context.h"
+#include "mojo/core/user_message_impl.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 
@@ -33,7 +33,7 @@
 #endif
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
-#include "mojo/edk/system/mach_port_relay.h"
+#include "mojo/core/mach_port_relay.h"
 #endif
 
 #if !defined(OS_NACL)
@@ -41,16 +41,20 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
 #if defined(OS_NACL)
 template <typename T>
-void GenerateRandomName(T* out) { base::RandBytes(out, sizeof(T)); }
+void GenerateRandomName(T* out) {
+  base::RandBytes(out, sizeof(T));
+}
 #else
 template <typename T>
-void GenerateRandomName(T* out) { crypto::RandBytes(out, sizeof(T)); }
+void GenerateRandomName(T* out) {
+  crypto::RandBytes(out, sizeof(T));
+}
 #endif
 
 ports::NodeName GetRandomNodeName() {
@@ -153,8 +157,7 @@
 }
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
-void NodeController::CreateMachPortRelay(
-    base::PortProvider* port_provider) {
+void NodeController::CreateMachPortRelay(base::PortProvider* port_provider) {
   base::AutoLock lock(mach_port_relay_lock_);
   DCHECK(!mach_port_relay_);
   mach_port_relay_.reset(new MachPortRelay(port_provider));
@@ -350,7 +353,7 @@
       NodeChannel::Create(this, std::move(node_connection_params),
                           io_task_runner_, process_error_callback);
 
-#else  // !defined(OS_MACOSX) && !defined(OS_NACL)
+#else   // !defined(OS_MACOSX) && !defined(OS_NACL)
   scoped_refptr<NodeChannel> channel =
       NodeChannel::Create(this, std::move(connection_params), io_task_runner_,
                           process_error_callback);
@@ -1228,7 +1231,7 @@
     if (shutdown_callback_.is_null())
       return;
     if (!node_->CanShutdownCleanly(
-          ports::Node::ShutdownPolicy::ALLOW_LOCAL_PORTS)) {
+            ports::Node::ShutdownPolicy::ALLOW_LOCAL_PORTS)) {
       DVLOG(2) << "Unable to cleanly shut down node " << name_;
       return;
     }
@@ -1265,5 +1268,5 @@
 NodeController::IsolatedConnection& NodeController::IsolatedConnection::
 operator=(IsolatedConnection&& other) = default;
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/node_controller.h b/mojo/core/node_controller.h
similarity index 95%
rename from mojo/edk/system/node_controller.h
rename to mojo/core/node_controller.h
index 406d84f1..fac39df9 100644
--- a/mojo/edk/system/node_controller.h
+++ b/mojo/core/node_controller.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 MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
-#define MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
+#ifndef MOJO_CORE_NODE_CONTROLLER_H_
+#define MOJO_CORE_NODE_CONTROLLER_H_
 
 #include <map>
 #include <memory>
@@ -21,14 +21,14 @@
 #include "base/memory/writable_shared_memory_region.h"
 #include "base/task_runner.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/atomic_flag.h"
-#include "mojo/edk/system/node_channel.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/node.h"
-#include "mojo/edk/system/ports/node_delegate.h"
-#include "mojo/edk/system/scoped_process_handle.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/atomic_flag.h"
+#include "mojo/core/node_channel.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/name.h"
+#include "mojo/core/ports/node.h"
+#include "mojo/core/ports/node_delegate.h"
+#include "mojo/core/scoped_process_handle.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/cpp/platform/platform_handle.h"
 
 namespace base {
@@ -36,7 +36,7 @@
 }
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class Broker;
 class Core;
@@ -133,8 +133,8 @@
  private:
   friend Core;
 
-  using NodeMap = std::unordered_map<ports::NodeName,
-                                     scoped_refptr<NodeChannel>>;
+  using NodeMap =
+      std::unordered_map<ports::NodeName, scoped_refptr<NodeChannel>>;
   using OutgoingMessageQueue = base::queue<Channel::MessagePtr>;
   using PortMap = std::map<std::string, ports::PortRef>;
 
@@ -340,7 +340,7 @@
   DISALLOW_COPY_AND_ASSIGN(NodeController);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_NODE_CONTROLLER_H_
+#endif  // MOJO_CORE_NODE_CONTROLLER_H_
diff --git a/mojo/edk/system/options_validation.h b/mojo/core/options_validation.h
similarity index 93%
rename from mojo/edk/system/options_validation.h
rename to mojo/core/options_validation.h
index e1b337d..ae41208 100644
--- a/mojo/edk/system/options_validation.h
+++ b/mojo/core/options_validation.h
@@ -8,8 +8,8 @@
 // but any |flags| specified must be known to the system (otherwise, an error of
 // |MOJO_RESULT_UNIMPLEMENTED| should be returned).
 
-#ifndef MOJO_EDK_SYSTEM_OPTIONS_VALIDATION_H_
-#define MOJO_EDK_SYSTEM_OPTIONS_VALIDATION_H_
+#ifndef MOJO_CORE_OPTIONS_VALIDATION_H_
+#define MOJO_CORE_OPTIONS_VALIDATION_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -18,11 +18,11 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/c/system/types.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 template <class Options>
 class UserOptionsReader {
@@ -91,7 +91,7 @@
 #define OPTIONS_STRUCT_HAS_MEMBER(Options, member, reader) \
   reader.HasMember(offsetof(Options, member), sizeof(reader.options().member))
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_OPTIONS_VALIDATION_H_
+#endif  // MOJO_CORE_OPTIONS_VALIDATION_H_
diff --git a/mojo/edk/system/options_validation_unittest.cc b/mojo/core/options_validation_unittest.cc
similarity index 97%
rename from mojo/edk/system/options_validation_unittest.cc
rename to mojo/core/options_validation_unittest.cc
index a01a92c..52e0032 100644
--- a/mojo/edk/system/options_validation_unittest.cc
+++ b/mojo/core/options_validation_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 "mojo/edk/system/options_validation.h"
+#include "mojo/core/options_validation.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -11,7 +11,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 // Declare a test options struct just as we do in actual public headers.
@@ -130,5 +130,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/platform_handle_dispatcher.cc b/mojo/core/platform_handle_dispatcher.cc
similarity index 96%
rename from mojo/edk/system/platform_handle_dispatcher.cc
rename to mojo/core/platform_handle_dispatcher.cc
index 1048144..7029b96 100644
--- a/mojo/edk/system/platform_handle_dispatcher.cc
+++ b/mojo/core/platform_handle_dispatcher.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/platform_handle_dispatcher.h"
+#include "mojo/core/platform_handle_dispatcher.h"
 
 #include "base/synchronization/lock.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // static
 scoped_refptr<PlatformHandleDispatcher> PlatformHandleDispatcher::Create(
@@ -92,5 +92,5 @@
   DCHECK(!platform_handle_.is_valid());
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/platform_handle_dispatcher.h b/mojo/core/platform_handle_dispatcher.h
similarity index 84%
rename from mojo/edk/system/platform_handle_dispatcher.h
rename to mojo/core/platform_handle_dispatcher.h
index c6180b0..8d9627c39 100644
--- a/mojo/edk/system/platform_handle_dispatcher.h
+++ b/mojo/core/platform_handle_dispatcher.h
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_PLATFORM_HANDLE_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_PLATFORM_HANDLE_DISPATCHER_H_
+#ifndef MOJO_CORE_PLATFORM_HANDLE_DISPATCHER_H_
+#define MOJO_CORE_PLATFORM_HANDLE_DISPATCHER_H_
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/cpp/platform/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class MOJO_SYSTEM_IMPL_EXPORT PlatformHandleDispatcher : public Dispatcher {
  public:
@@ -55,7 +55,7 @@
   DISALLOW_COPY_AND_ASSIGN(PlatformHandleDispatcher);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PLATFORM_HANDLE_DISPATCHER_H_
+#endif  // MOJO_CORE_PLATFORM_HANDLE_DISPATCHER_H_
diff --git a/mojo/edk/system/platform_handle_dispatcher_unittest.cc b/mojo/core/platform_handle_dispatcher_unittest.cc
similarity index 96%
rename from mojo/edk/system/platform_handle_dispatcher_unittest.cc
rename to mojo/core/platform_handle_dispatcher_unittest.cc
index 3e3c777..8e3ad81 100644
--- a/mojo/edk/system/platform_handle_dispatcher_unittest.cc
+++ b/mojo/core/platform_handle_dispatcher_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 "mojo/edk/system/platform_handle_dispatcher.h"
+#include "mojo/core/platform_handle_dispatcher.h"
 
 #include <stdio.h>
 #include <utility>
@@ -12,12 +12,12 @@
 #include "base/files/scoped_file.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ref_counted.h"
-#include "mojo/edk/test/test_utils.h"
+#include "mojo/core/test/test_utils.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 TEST(PlatformHandleDispatcherTest, Basic) {
@@ -121,5 +121,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/platform_handle_in_transit.cc b/mojo/core/platform_handle_in_transit.cc
similarity index 97%
rename from mojo/edk/system/platform_handle_in_transit.cc
rename to mojo/core/platform_handle_in_transit.cc
index 4210028f..7b82f27 100644
--- a/mojo/edk/system/platform_handle_in_transit.cc
+++ b/mojo/core/platform_handle_in_transit.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 "mojo/edk/system/platform_handle_in_transit.h"
+#include "mojo/core/platform_handle_in_transit.h"
 
 #include <utility>
 
@@ -17,7 +17,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -152,5 +152,5 @@
 }
 #endif
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/platform_handle_in_transit.h b/mojo/core/platform_handle_in_transit.h
similarity index 93%
rename from mojo/edk/system/platform_handle_in_transit.h
rename to mojo/core/platform_handle_in_transit.h
index bed2e04c..b75a01fb 100644
--- a/mojo/edk/system/platform_handle_in_transit.h
+++ b/mojo/core/platform_handle_in_transit.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 MOJO_EDK_SYSTEM_PLATFORM_HANDLE_IN_TRANSIT_H_
-#define MOJO_EDK_SYSTEM_PLATFORM_HANDLE_IN_TRANSIT_H_
+#ifndef MOJO_CORE_PLATFORM_HANDLE_IN_TRANSIT_H_
+#define MOJO_CORE_PLATFORM_HANDLE_IN_TRANSIT_H_
 
 #include "base/macros.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/scoped_process_handle.h"
+#include "mojo/core/scoped_process_handle.h"
 #include "mojo/public/cpp/platform/platform_handle.h"
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
@@ -19,7 +19,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // Owns a PlatformHandle which may actually belong to another process. On
 // Windows and (sometimes) Mac, handles in a message object may take on values
@@ -101,7 +101,7 @@
   DISALLOW_COPY_AND_ASSIGN(PlatformHandleInTransit);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PLATFORM_HANDLE_IN_TRANSIT_H_
+#endif  // MOJO_CORE_PLATFORM_HANDLE_IN_TRANSIT_H_
diff --git a/mojo/edk/system/platform_handle_utils.cc b/mojo/core/platform_handle_utils.cc
similarity index 95%
rename from mojo/edk/system/platform_handle_utils.cc
rename to mojo/core/platform_handle_utils.cc
index 8c09818..c7fb3b3e 100644
--- a/mojo/edk/system/platform_handle_utils.cc
+++ b/mojo/core/platform_handle_utils.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 "mojo/edk/system/platform_handle_utils.h"
+#include "mojo/core/platform_handle_utils.h"
 
 #include "build/build_config.h"
 
@@ -19,7 +19,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 void ExtractPlatformHandlesFromSharedMemoryRegionHandle(
     base::subtle::PlatformSharedMemoryRegion::ScopedPlatformHandle handle,
@@ -63,5 +63,5 @@
 #endif
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/platform_handle_utils.h b/mojo/core/platform_handle_utils.h
similarity index 81%
rename from mojo/edk/system/platform_handle_utils.h
rename to mojo/core/platform_handle_utils.h
index f04f223..b18275b5 100644
--- a/mojo/edk/system/platform_handle_utils.h
+++ b/mojo/core/platform_handle_utils.h
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_PLATFORM_HANDLE_UTILS_H_
-#define MOJO_EDK_SYSTEM_PLATFORM_HANDLE_UTILS_H_
+#ifndef MOJO_CORE_PLATFORM_HANDLE_UTILS_H_
+#define MOJO_CORE_PLATFORM_HANDLE_UTILS_H_
 
 #include "base/memory/platform_shared_memory_region.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/c/system/platform_handle.h"
 #include "mojo/public/c/system/types.h"
 #include "mojo/public/cpp/platform/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // Converts a base shared memory platform handle into one (maybe two on POSIX)
 // PlatformHandle(s).
@@ -29,7 +29,7 @@
     PlatformHandle handle,
     PlatformHandle readonly_handle);
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PLATFORM_HANDLE_UTILS_H_
+#endif  // MOJO_CORE_PLATFORM_HANDLE_UTILS_H_
diff --git a/mojo/edk/system/platform_shared_memory_mapping.cc b/mojo/core/platform_shared_memory_mapping.cc
similarity index 96%
rename from mojo/edk/system/platform_shared_memory_mapping.cc
rename to mojo/core/platform_shared_memory_mapping.cc
index 80f14f6..6b8d6720 100644
--- a/mojo/edk/system/platform_shared_memory_mapping.cc
+++ b/mojo/core/platform_shared_memory_mapping.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 "mojo/edk/system/platform_shared_memory_mapping.h"
+#include "mojo/core/platform_shared_memory_mapping.h"
 
 #include <utility>
 
@@ -19,7 +19,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -100,5 +100,5 @@
   return length_;
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/platform_shared_memory_mapping.h b/mojo/core/platform_shared_memory_mapping.h
similarity index 84%
rename from mojo/edk/system/platform_shared_memory_mapping.h
rename to mojo/core/platform_shared_memory_mapping.h
index 764fe4f..b7c43ac 100644
--- a/mojo/edk/system/platform_shared_memory_mapping.h
+++ b/mojo/core/platform_shared_memory_mapping.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 MOJO_EDK_SYSTEM_PLATFORM_SHARED_MEMORY_MAPPING_H_
-#define MOJO_EDK_SYSTEM_PLATFORM_SHARED_MEMORY_MAPPING_H_
+#ifndef MOJO_CORE_PLATFORM_SHARED_MEMORY_MAPPING_H_
+#define MOJO_CORE_PLATFORM_SHARED_MEMORY_MAPPING_H_
 
 #include <stddef.h>
 
@@ -13,10 +13,10 @@
 #include "base/macros.h"
 #include "base/memory/platform_shared_memory_region.h"
 #include "base/memory/shared_memory_mapping.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/system_impl_export.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // A mapping of a |base::subtle::PlatformSharedMemoryRegion|, created
 // exclusively by |SharedBufferDispatcher::MapBuffer()|. Automatically maps
@@ -54,7 +54,7 @@
   DISALLOW_COPY_AND_ASSIGN(PlatformSharedMemoryMapping);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PLATFORM_SHARED_MEMORY_MAPPING_H_
+#endif  // MOJO_CORE_PLATFORM_SHARED_MEMORY_MAPPING_H_
diff --git a/mojo/edk/system/platform_wrapper_unittest.cc b/mojo/core/platform_wrapper_unittest.cc
similarity index 98%
rename from mojo/edk/system/platform_wrapper_unittest.cc
rename to mojo/core/platform_wrapper_unittest.cc
index c87ff5a..e795b94 100644
--- a/mojo/edk/system/platform_wrapper_unittest.cc
+++ b/mojo/core/platform_wrapper_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/memory/shared_memory.h"
 #include "base/process/process_handle.h"
 #include "build/build_config.h"
-#include "mojo/edk/test/mojo_test_base.h"
+#include "mojo/core/test/mojo_test_base.h"
 #include "mojo/public/c/system/platform_handle.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -55,7 +55,7 @@
 }
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 using PlatformWrapperTest = test::MojoTestBase;
@@ -245,5 +245,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/BUILD.gn b/mojo/core/ports/BUILD.gn
similarity index 91%
rename from mojo/edk/system/ports/BUILD.gn
rename to mojo/core/ports/BUILD.gn
index 1a5ba79..68dce3f 100644
--- a/mojo/edk/system/ports/BUILD.gn
+++ b/mojo/core/ports/BUILD.gn
@@ -5,7 +5,7 @@
 import("//testing/test.gni")
 
 component("ports") {
-  output_name = "mojo_edk_ports"
+  output_name = "mojo_core_ports"
 
   sources = [
     "event.cc",
@@ -29,7 +29,7 @@
     "user_message.h",
   ]
 
-  defines = [ "IS_MOJO_EDK_PORTS_IMPL" ]
+  defines = [ "IS_MOJO_CORE_PORTS_IMPL" ]
 
   public_deps = [
     "//base",
diff --git a/mojo/edk/system/ports/event.cc b/mojo/core/ports/event.cc
similarity index 98%
rename from mojo/edk/system/ports/event.cc
rename to mojo/core/ports/event.cc
index 1c5abaf8..bdf000c 100644
--- a/mojo/edk/system/ports/event.cc
+++ b/mojo/core/ports/event.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/ports/event.h"
+#include "mojo/core/ports/event.h"
 
 #include <stdint.h>
 #include <string.h>
 
 #include "base/numerics/safe_math.h"
-#include "mojo/edk/system/ports/user_message.h"
+#include "mojo/core/ports/user_message.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 namespace {
@@ -373,5 +373,5 @@
 }
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/event.h b/mojo/core/ports/event.h
similarity index 91%
rename from mojo/edk/system/ports/event.h
rename to mojo/core/ports/event.h
index ab8a4d8..1fa5efa 100644
--- a/mojo/edk/system/ports/event.h
+++ b/mojo/core/ports/event.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 MOJO_EDK_SYSTEM_PORTS_EVENT_H_
-#define MOJO_EDK_SYSTEM_PORTS_EVENT_H_
+#ifndef MOJO_CORE_PORTS_EVENT_H_
+#define MOJO_CORE_PORTS_EVENT_H_
 
 #include <stdint.h>
 
@@ -12,11 +12,11 @@
 #include "base/component_export.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/user_message.h"
+#include "mojo/core/ports/name.h"
+#include "mojo/core/ports/user_message.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 class Event;
@@ -25,7 +25,7 @@
 
 // A Event is the fundamental unit of operation and communication within and
 // between Nodes.
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) Event {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) Event {
  public:
   enum Type : uint32_t {
     // A user message event contains arbitrary user-specified payload data
@@ -103,7 +103,7 @@
   DISALLOW_COPY_AND_ASSIGN(Event);
 };
 
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) UserMessageEvent : public Event {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) UserMessageEvent : public Event {
  public:
   explicit UserMessageEvent(size_t num_ports);
   ~UserMessageEvent() override;
@@ -153,7 +153,7 @@
   DISALLOW_COPY_AND_ASSIGN(UserMessageEvent);
 };
 
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) PortAcceptedEvent : public Event {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) PortAcceptedEvent : public Event {
  public:
   explicit PortAcceptedEvent(const PortName& port_name);
   ~PortAcceptedEvent() override;
@@ -169,7 +169,7 @@
   DISALLOW_COPY_AND_ASSIGN(PortAcceptedEvent);
 };
 
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) ObserveProxyEvent : public Event {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) ObserveProxyEvent : public Event {
  public:
   ObserveProxyEvent(const PortName& port_name,
                     const NodeName& proxy_node_name,
@@ -204,7 +204,7 @@
   DISALLOW_COPY_AND_ASSIGN(ObserveProxyEvent);
 };
 
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) ObserveProxyAckEvent : public Event {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) ObserveProxyAckEvent : public Event {
  public:
   ObserveProxyAckEvent(const PortName& port_name, uint64_t last_sequence_num);
   ~ObserveProxyAckEvent() override;
@@ -225,7 +225,7 @@
   DISALLOW_COPY_AND_ASSIGN(ObserveProxyAckEvent);
 };
 
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) ObserveClosureEvent : public Event {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) ObserveClosureEvent : public Event {
  public:
   ObserveClosureEvent(const PortName& port_name, uint64_t last_sequence_num);
   ~ObserveClosureEvent() override;
@@ -249,7 +249,7 @@
   DISALLOW_COPY_AND_ASSIGN(ObserveClosureEvent);
 };
 
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) MergePortEvent : public Event {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) MergePortEvent : public Event {
  public:
   MergePortEvent(const PortName& port_name,
                  const PortName& new_port_name,
@@ -276,7 +276,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_EVENT_H_
+#endif  // MOJO_CORE_PORTS_EVENT_H_
diff --git a/mojo/edk/system/ports/message_filter.h b/mojo/core/ports/message_filter.h
similarity index 77%
rename from mojo/edk/system/ports/message_filter.h
rename to mojo/core/ports/message_filter.h
index 1b1f2ce..f09903ffc 100644
--- a/mojo/edk/system/ports/message_filter.h
+++ b/mojo/core/ports/message_filter.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_PORTS_MESSAGE_FILTER_H_
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_FILTER_H_
+#ifndef MOJO_CORE_PORTS_MESSAGE_FILTER_H_
+#define MOJO_CORE_PORTS_MESSAGE_FILTER_H_
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 class UserMessageEvent;
@@ -23,7 +23,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_FILTER_H_
+#endif  // MOJO_CORE_PORTS_MESSAGE_FILTER_H_
diff --git a/mojo/edk/system/ports/message_queue.cc b/mojo/core/ports/message_queue.cc
similarity index 93%
rename from mojo/edk/system/ports/message_queue.cc
rename to mojo/core/ports/message_queue.cc
index 8596362..258e5e7 100644
--- a/mojo/edk/system/ports/message_queue.cc
+++ b/mojo/core/ports/message_queue.cc
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/ports/message_queue.h"
+#include "mojo/core/ports/message_queue.h"
 
 #include <algorithm>
 
 #include "base/logging.h"
-#include "mojo/edk/system/ports/message_filter.h"
+#include "mojo/core/ports/message_filter.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 // Used by std::{push,pop}_heap functions
@@ -75,5 +75,5 @@
 }
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/message_queue.h b/mojo/core/ports/message_queue.h
similarity index 89%
rename from mojo/edk/system/ports/message_queue.h
rename to mojo/core/ports/message_queue.h
index 829d2172..05ce13a 100644
--- a/mojo/edk/system/ports/message_queue.h
+++ b/mojo/core/ports/message_queue.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 MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_
-#define MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_
+#ifndef MOJO_CORE_PORTS_MESSAGE_QUEUE_H_
+#define MOJO_CORE_PORTS_MESSAGE_QUEUE_H_
 
 #include <stdint.h>
 
@@ -13,10 +13,10 @@
 
 #include "base/component_export.h"
 #include "base/macros.h"
-#include "mojo/edk/system/ports/event.h"
+#include "mojo/core/ports/event.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 constexpr uint64_t kInitialSequenceNum = 1;
@@ -28,7 +28,7 @@
 // known sequence number and can indicate whether the next sequential message is
 // available. Thus the queue enforces message ordering for the consumer without
 // enforcing it for the producer (see AcceptMessage() below.)
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) MessageQueue {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) MessageQueue {
  public:
   explicit MessageQueue();
   explicit MessageQueue(uint64_t next_sequence_num);
@@ -71,7 +71,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_MESSAGE_QUEUE_H_
+#endif  // MOJO_CORE_PORTS_MESSAGE_QUEUE_H_
diff --git a/mojo/edk/system/ports/name.cc b/mojo/core/ports/name.cc
similarity index 88%
rename from mojo/edk/system/ports/name.cc
rename to mojo/core/ports/name.cc
index fe03b4b..332a0a0 100644
--- a/mojo/edk/system/ports/name.cc
+++ b/mojo/core/ports/name.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/ports/name.h"
+#include "mojo/core/ports/name.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 const PortName kInvalidPortName = {0, 0};
@@ -22,5 +22,5 @@
 }
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/core/ports/name.h b/mojo/core/ports/name.h
new file mode 100644
index 0000000..415ba65a
--- /dev/null
+++ b/mojo/core/ports/name.h
@@ -0,0 +1,76 @@
+// 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 MOJO_CORE_PORTS_NAME_H_
+#define MOJO_CORE_PORTS_NAME_H_
+
+#include <stdint.h>
+
+#include <ostream>
+#include <tuple>
+
+#include "base/component_export.h"
+#include "base/hash.h"
+
+namespace mojo {
+namespace core {
+namespace ports {
+
+struct COMPONENT_EXPORT(MOJO_CORE_PORTS) Name {
+  Name(uint64_t v1, uint64_t v2) : v1(v1), v2(v2) {}
+  uint64_t v1, v2;
+};
+
+inline bool operator==(const Name& a, const Name& b) {
+  return a.v1 == b.v1 && a.v2 == b.v2;
+}
+
+inline bool operator!=(const Name& a, const Name& b) {
+  return !(a == b);
+}
+
+inline bool operator<(const Name& a, const Name& b) {
+  return std::tie(a.v1, a.v2) < std::tie(b.v1, b.v2);
+}
+
+COMPONENT_EXPORT(MOJO_CORE_PORTS)
+std::ostream& operator<<(std::ostream& stream, const Name& name);
+
+struct COMPONENT_EXPORT(MOJO_CORE_PORTS) PortName : Name {
+  PortName() : Name(0, 0) {}
+  PortName(uint64_t v1, uint64_t v2) : Name(v1, v2) {}
+};
+
+extern COMPONENT_EXPORT(MOJO_CORE_PORTS) const PortName kInvalidPortName;
+
+struct COMPONENT_EXPORT(MOJO_CORE_PORTS) NodeName : Name {
+  NodeName() : Name(0, 0) {}
+  NodeName(uint64_t v1, uint64_t v2) : Name(v1, v2) {}
+};
+
+extern COMPONENT_EXPORT(MOJO_CORE_PORTS) const NodeName kInvalidNodeName;
+
+}  // namespace ports
+}  // namespace core
+}  // namespace mojo
+
+namespace std {
+
+template <>
+struct COMPONENT_EXPORT(MOJO_CORE_PORTS) hash<mojo::core::ports::PortName> {
+  std::size_t operator()(const mojo::core::ports::PortName& name) const {
+    return base::HashInts64(name.v1, name.v2);
+  }
+};
+
+template <>
+struct COMPONENT_EXPORT(MOJO_CORE_PORTS) hash<mojo::core::ports::NodeName> {
+  std::size_t operator()(const mojo::core::ports::NodeName& name) const {
+    return base::HashInts64(name.v1, name.v2);
+  }
+};
+
+}  // namespace std
+
+#endif  // MOJO_CORE_PORTS_NAME_H_
diff --git a/mojo/edk/system/ports/name_unittest.cc b/mojo/core/ports/name_unittest.cc
similarity index 95%
rename from mojo/edk/system/ports/name_unittest.cc
rename to mojo/core/ports/name_unittest.cc
index 7e4d82b7..520295c 100644
--- a/mojo/edk/system/ports/name_unittest.cc
+++ b/mojo/core/ports/name_unittest.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/ports/name.h"
+#include "mojo/core/ports/name.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 namespace test {
 
@@ -71,5 +71,5 @@
 
 }  // namespace test
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/node.cc b/mojo/core/ports/node.cc
similarity index 99%
rename from mojo/edk/system/ports/node.cc
rename to mojo/core/ports/node.cc
index 78365e4..fd458654 100644
--- a/mojo/edk/system/ports/node.cc
+++ b/mojo/core/ports/node.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 "mojo/edk/system/ports/node.h"
+#include "mojo/core/ports/node.h"
 
 #include <string.h>
 
@@ -18,9 +18,9 @@
 #include "base/synchronization/lock.h"
 #include "base/threading/thread_local.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/node_delegate.h"
-#include "mojo/edk/system/ports/port_locker.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/node_delegate.h"
+#include "mojo/core/ports/port_locker.h"
 
 #if !defined(OS_NACL)
 #include "crypto/random.h"
@@ -29,7 +29,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 namespace {
@@ -1381,5 +1381,5 @@
 #endif
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/node.h b/mojo/core/ports/node.h
similarity index 95%
rename from mojo/edk/system/ports/node.h
rename to mojo/core/ports/node.h
index ec4bbbc..bf600e76 100644
--- a/mojo/edk/system/ports/node.h
+++ b/mojo/core/ports/node.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 MOJO_EDK_SYSTEM_PORTS_NODE_H_
-#define MOJO_EDK_SYSTEM_PORTS_NODE_H_
+#ifndef MOJO_CORE_PORTS_NODE_H_
+#define MOJO_CORE_PORTS_NODE_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -15,14 +15,14 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/port.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/ports/user_data.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/name.h"
+#include "mojo/core/ports/port.h"
+#include "mojo/core/ports/port_ref.h"
+#include "mojo/core/ports/user_data.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 enum : int {
@@ -62,7 +62,7 @@
 // by Nodes to coordinate Port behavior and lifetime within and across Nodes.
 // See Event documentation for description of different types of events used by
 // a Node to coordinate behavior.
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) Node {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) Node {
  public:
   enum class ShutdownPolicy {
     DONT_ALLOW_LOCAL_PORTS,
@@ -242,7 +242,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_NODE_H_
+#endif  // MOJO_CORE_PORTS_NODE_H_
diff --git a/mojo/edk/system/ports/node_delegate.h b/mojo/core/ports/node_delegate.h
similarity index 73%
rename from mojo/edk/system/ports/node_delegate.h
rename to mojo/core/ports/node_delegate.h
index 3c7550a..afe1c4c 100644
--- a/mojo/edk/system/ports/node_delegate.h
+++ b/mojo/core/ports/node_delegate.h
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_PORTS_NODE_DELEGATE_H_
-#define MOJO_EDK_SYSTEM_PORTS_NODE_DELEGATE_H_
+#ifndef MOJO_CORE_PORTS_NODE_DELEGATE_H_
+#define MOJO_CORE_PORTS_NODE_DELEGATE_H_
 
 #include <stddef.h>
 
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/port_ref.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/name.h"
+#include "mojo/core/ports/port_ref.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 class NodeDelegate {
@@ -32,7 +32,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_NODE_DELEGATE_H_
+#endif  // MOJO_CORE_PORTS_NODE_DELEGATE_H_
diff --git a/mojo/edk/system/ports/port.cc b/mojo/core/ports/port.cc
similarity index 88%
rename from mojo/edk/system/ports/port.cc
rename to mojo/core/ports/port.cc
index e4403ae..7186979 100644
--- a/mojo/edk/system/ports/port.cc
+++ b/mojo/core/ports/port.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/ports/port.h"
+#include "mojo/core/ports/port.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 Port::Port(uint64_t next_sequence_num_to_send,
@@ -20,5 +20,5 @@
 Port::~Port() {}
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/port.h b/mojo/core/ports/port.h
similarity index 95%
rename from mojo/edk/system/ports/port.h
rename to mojo/core/ports/port.h
index e10bfeb..d1a825e2 100644
--- a/mojo/edk/system/ports/port.h
+++ b/mojo/core/ports/port.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 MOJO_EDK_SYSTEM_PORTS_PORT_H_
-#define MOJO_EDK_SYSTEM_PORTS_PORT_H_
+#ifndef MOJO_CORE_PORTS_PORT_H_
+#define MOJO_CORE_PORTS_PORT_H_
 
 #include <memory>
 #include <queue>
@@ -13,12 +13,12 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/message_queue.h"
-#include "mojo/edk/system/ports/user_data.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/message_queue.h"
+#include "mojo/core/ports/user_data.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 class PortLocker;
@@ -169,7 +169,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_PORT_H_
+#endif  // MOJO_CORE_PORTS_PORT_H_
diff --git a/mojo/edk/system/ports/port_locker.cc b/mojo/core/ports/port_locker.cc
similarity index 93%
rename from mojo/edk/system/ports/port_locker.cc
rename to mojo/core/ports/port_locker.cc
index e84d0d0..8804923 100644
--- a/mojo/edk/system/ports/port_locker.cc
+++ b/mojo/core/ports/port_locker.cc
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/ports/port_locker.h"
+#include "mojo/core/ports/port_locker.h"
 
 #include <algorithm>
 
-#include "mojo/edk/system/ports/port.h"
+#include "mojo/core/ports/port.h"
 
 #if DCHECK_IS_ON()
 #include "base/threading/thread_local.h"
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 namespace {
@@ -70,5 +70,5 @@
 SinglePortLocker::~SinglePortLocker() = default;
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/port_locker.h b/mojo/core/ports/port_locker.h
similarity index 91%
rename from mojo/edk/system/ports/port_locker.h
rename to mojo/core/ports/port_locker.h
index 38782068..0da2654 100644
--- a/mojo/edk/system/ports/port_locker.h
+++ b/mojo/core/ports/port_locker.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_PORTS_PORT_LOCKER_H_
-#define MOJO_EDK_SYSTEM_PORTS_PORT_LOCKER_H_
+#ifndef MOJO_CORE_PORTS_PORT_LOCKER_H_
+#define MOJO_CORE_PORTS_PORT_LOCKER_H_
 
 #include <stdint.h>
 
 #include "base/macros.h"
-#include "mojo/edk/system/ports/port_ref.h"
+#include "mojo/core/ports/port_ref.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 class Port;
@@ -80,7 +80,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_PORT_LOCKER_H_
+#endif  // MOJO_CORE_PORTS_PORT_LOCKER_H_
diff --git a/mojo/edk/system/ports/port_ref.cc b/mojo/core/ports/port_ref.cc
similarity index 77%
rename from mojo/edk/system/ports/port_ref.cc
rename to mojo/core/ports/port_ref.cc
index 66e48c2..a3d312b 100644
--- a/mojo/edk/system/ports/port_ref.cc
+++ b/mojo/core/ports/port_ref.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 "mojo/edk/system/ports/port_ref.h"
+#include "mojo/core/ports/port_ref.h"
 
-#include "mojo/edk/system/ports/port.h"
+#include "mojo/core/ports/port.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
-PortRef::~PortRef() {
-}
+PortRef::~PortRef() {}
 
-PortRef::PortRef() {
-}
+PortRef::PortRef() {}
 
 PortRef::PortRef(const PortName& name, scoped_refptr<Port> port)
     : name_(name), port_(std::move(port)) {}
@@ -28,5 +26,5 @@
 PortRef& PortRef::operator=(PortRef&& other) = default;
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/port_ref.h b/mojo/core/ports/port_ref.h
similarity index 76%
rename from mojo/edk/system/ports/port_ref.h
rename to mojo/core/ports/port_ref.h
index 9bafe38..b63d6cf 100644
--- a/mojo/edk/system/ports/port_ref.h
+++ b/mojo/core/ports/port_ref.h
@@ -2,22 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_PORTS_PORT_REF_H_
-#define MOJO_EDK_SYSTEM_PORTS_PORT_REF_H_
+#ifndef MOJO_CORE_PORTS_PORT_REF_H_
+#define MOJO_CORE_PORTS_PORT_REF_H_
 
 #include "base/component_export.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "mojo/edk/system/ports/name.h"
+#include "mojo/core/ports/name.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 class Port;
 class PortLocker;
 
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) PortRef {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) PortRef {
  public:
   ~PortRef();
   PortRef();
@@ -43,7 +43,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_PORT_REF_H_
+#endif  // MOJO_CORE_PORTS_PORT_REF_H_
diff --git a/mojo/edk/system/ports/ports_unittest.cc b/mojo/core/ports/ports_unittest.cc
similarity index 99%
rename from mojo/edk/system/ports/ports_unittest.cc
rename to mojo/core/ports/ports_unittest.cc
index f04ac49..3d18bb6 100644
--- a/mojo/edk/system/ports/ports_unittest.cc
+++ b/mojo/core/ports/ports_unittest.cc
@@ -22,14 +22,14 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/node.h"
-#include "mojo/edk/system/ports/node_delegate.h"
-#include "mojo/edk/system/ports/user_message.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/node.h"
+#include "mojo/core/ports/node_delegate.h"
+#include "mojo/core/ports/user_message.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 namespace test {
 
@@ -1640,5 +1640,5 @@
 
 }  // namespace test
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/user_data.h b/mojo/core/ports/user_data.h
similarity index 72%
rename from mojo/edk/system/ports/user_data.h
rename to mojo/core/ports/user_data.h
index 73e7d17..e18d9b7 100644
--- a/mojo/edk/system/ports/user_data.h
+++ b/mojo/core/ports/user_data.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_PORTS_USER_DATA_H_
-#define MOJO_EDK_SYSTEM_PORTS_USER_DATA_H_
+#ifndef MOJO_CORE_PORTS_USER_DATA_H_
+#define MOJO_CORE_PORTS_USER_DATA_H_
 
 #include "base/memory/ref_counted.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 class UserData : public base::RefCountedThreadSafe<UserData> {
@@ -19,7 +19,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_USER_DATA_H_
+#endif  // MOJO_CORE_PORTS_USER_DATA_H_
diff --git a/mojo/edk/system/ports/user_message.cc b/mojo/core/ports/user_message.cc
similarity index 83%
rename from mojo/edk/system/ports/user_message.cc
rename to mojo/core/ports/user_message.cc
index 1976dcb8..69f58ce 100644
--- a/mojo/edk/system/ports/user_message.cc
+++ b/mojo/core/ports/user_message.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/ports/user_message.h"
+#include "mojo/core/ports/user_message.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 UserMessage::UserMessage(const TypeInfo* type_info) : type_info_(type_info) {}
@@ -17,5 +17,5 @@
 }
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/ports/user_message.h b/mojo/core/ports/user_message.h
similarity index 86%
rename from mojo/edk/system/ports/user_message.h
rename to mojo/core/ports/user_message.h
index b4414b2..04aaaf3 100644
--- a/mojo/edk/system/ports/user_message.h
+++ b/mojo/core/ports/user_message.h
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_PORTS_USER_MESSAGE_H_
-#define MOJO_EDK_SYSTEM_PORTS_USER_MESSAGE_H_
+#ifndef MOJO_CORE_PORTS_USER_MESSAGE_H_
+#define MOJO_CORE_PORTS_USER_MESSAGE_H_
 
 #include "base/component_export.h"
 #include "base/macros.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace ports {
 
 // Base type to use for any embedder-defined user message implementation. This
@@ -22,7 +22,7 @@
 // |kUserMessageTypeInfo| and pass its address down to the UserMessage
 // constructor. The type of a UserMessage can then be dynamically inspected by
 // comparing |type_info()| to any subclass's |&kUserMessageTypeInfo|.
-class COMPONENT_EXPORT(MOJO_EDK_PORTS) UserMessage {
+class COMPONENT_EXPORT(MOJO_CORE_PORTS) UserMessage {
  public:
   struct TypeInfo {};
 
@@ -46,7 +46,7 @@
 };
 
 }  // namespace ports
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_PORTS_USER_MESSAGE_H_
+#endif  // MOJO_CORE_PORTS_USER_MESSAGE_H_
diff --git a/mojo/edk/system/request_context.cc b/mojo/core/request_context.cc
similarity index 97%
rename from mojo/edk/system/request_context.cc
rename to mojo/core/request_context.cc
index 4029aa4d..0a481af7 100644
--- a/mojo/edk/system/request_context.cc
+++ b/mojo/core/request_context.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/request_context.h"
+#include "mojo/core/request_context.h"
 
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/threading/thread_local.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -112,5 +112,5 @@
 
 RequestContext::WatchNotifyFinalizer::~WatchNotifyFinalizer() {}
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/request_context.h b/mojo/core/request_context.h
similarity index 90%
rename from mojo/edk/system/request_context.h
rename to mojo/core/request_context.h
index d1f43bd..89988f2 100644
--- a/mojo/edk/system/request_context.h
+++ b/mojo/core/request_context.h
@@ -2,21 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_REQUEST_CONTEXT_H_
-#define MOJO_EDK_SYSTEM_REQUEST_CONTEXT_H_
+#ifndef MOJO_CORE_REQUEST_CONTEXT_H_
+#define MOJO_CORE_REQUEST_CONTEXT_H_
 
 #include "base/containers/stack_container.h"
 #include "base/macros.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/system_impl_export.h"
-#include "mojo/edk/system/watch.h"
+#include "mojo/core/handle_signals_state.h"
+#include "mojo/core/system_impl_export.h"
+#include "mojo/core/watch.h"
 
 namespace base {
-template<typename T> class ThreadLocalPointer;
+template <typename T>
+class ThreadLocalPointer;
 }
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // A RequestContext is a thread-local object which exists for the duration of
 // a single system API call. It is constructed immediately upon EDK entry and
@@ -101,7 +102,7 @@
   DISALLOW_COPY_AND_ASSIGN(RequestContext);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_REQUEST_CONTEXT_H_
+#endif  // MOJO_CORE_REQUEST_CONTEXT_H_
diff --git a/mojo/edk/run_all_core_unittests.cc b/mojo/core/run_all_core_unittests.cc
similarity index 100%
rename from mojo/edk/run_all_core_unittests.cc
rename to mojo/core/run_all_core_unittests.cc
diff --git a/mojo/edk/system/scoped_process_handle.cc b/mojo/core/scoped_process_handle.cc
similarity index 95%
rename from mojo/edk/system/scoped_process_handle.cc
rename to mojo/core/scoped_process_handle.cc
index 3921555..65dfcf78 100644
--- a/mojo/edk/system/scoped_process_handle.cc
+++ b/mojo/core/scoped_process_handle.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 "mojo/edk/system/scoped_process_handle.h"
+#include "mojo/core/scoped_process_handle.h"
 
 #include "build/build_config.h"
 
@@ -11,7 +11,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -86,5 +86,5 @@
   return ScopedProcessHandle();
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/scoped_process_handle.h b/mojo/core/scoped_process_handle.h
similarity index 89%
rename from mojo/edk/system/scoped_process_handle.h
rename to mojo/core/scoped_process_handle.h
index d4d34e0..4677145 100644
--- a/mojo/edk/system/scoped_process_handle.h
+++ b/mojo/core/scoped_process_handle.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 MOJO_EDK_SYSTEM_SCOPED_PROCESS_HANDLE_H_
-#define MOJO_EDK_SYSTEM_SCOPED_PROCESS_HANDLE_H_
+#ifndef MOJO_CORE_SCOPED_PROCESS_HANDLE_H_
+#define MOJO_CORE_SCOPED_PROCESS_HANDLE_H_
 
 #include "base/macros.h"
 #include "base/process/process_handle.h"
@@ -14,7 +14,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // Wraps a |base::ProcessHandle| with additional scoped lifetime semantics on
 // applicable platforms. For platforms where process handles aren't ownable
@@ -59,7 +59,7 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedProcessHandle);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_SCOPED_PROCESS_HANDLE_H_
+#endif  // MOJO_CORE_SCOPED_PROCESS_HANDLE_H_
diff --git a/mojo/edk/system/shared_buffer_dispatcher.cc b/mojo/core/shared_buffer_dispatcher.cc
similarity index 97%
rename from mojo/edk/system/shared_buffer_dispatcher.cc
rename to mojo/core/shared_buffer_dispatcher.cc
index 7028873..34ebf613 100644
--- a/mojo/edk/system/shared_buffer_dispatcher.cc
+++ b/mojo/core/shared_buffer_dispatcher.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 "mojo/edk/system/shared_buffer_dispatcher.h"
+#include "mojo/core/shared_buffer_dispatcher.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -14,15 +14,15 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "build/build_config.h"
-#include "mojo/edk/system/configuration.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/options_validation.h"
-#include "mojo/edk/system/platform_handle_utils.h"
-#include "mojo/edk/system/platform_shared_memory_mapping.h"
+#include "mojo/core/configuration.h"
+#include "mojo/core/node_controller.h"
+#include "mojo/core/options_validation.h"
+#include "mojo/core/platform_handle_utils.h"
+#include "mojo/core/platform_shared_memory_mapping.h"
 #include "mojo/public/c/system/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -441,5 +441,5 @@
   return MOJO_RESULT_OK;
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/shared_buffer_dispatcher.h b/mojo/core/shared_buffer_dispatcher.h
similarity index 93%
rename from mojo/edk/system/shared_buffer_dispatcher.h
rename to mojo/core/shared_buffer_dispatcher.h
index 8b38c84..cbdb3533 100644
--- a/mojo/edk/system/shared_buffer_dispatcher.h
+++ b/mojo/core/shared_buffer_dispatcher.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 MOJO_EDK_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
+#ifndef MOJO_CORE_SHARED_BUFFER_DISPATCHER_H_
+#define MOJO_CORE_SHARED_BUFFER_DISPATCHER_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -12,12 +12,12 @@
 
 #include "base/macros.h"
 #include "base/memory/platform_shared_memory_region.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/system_impl_export.h"
 
 namespace mojo {
 
-namespace edk {
+namespace core {
 
 class NodeController;
 class PlatformSharedMemoryMapping;
@@ -118,7 +118,7 @@
   DISALLOW_COPY_AND_ASSIGN(SharedBufferDispatcher);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_SHARED_BUFFER_DISPATCHER_H_
+#endif  // MOJO_CORE_SHARED_BUFFER_DISPATCHER_H_
diff --git a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc b/mojo/core/shared_buffer_dispatcher_unittest.cc
similarity index 93%
rename from mojo/edk/system/shared_buffer_dispatcher_unittest.cc
rename to mojo/core/shared_buffer_dispatcher_unittest.cc
index 768c7aa..22cbb44 100644
--- a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
+++ b/mojo/core/shared_buffer_dispatcher_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 "mojo/edk/system/shared_buffer_dispatcher.h"
+#include "mojo/core/shared_buffer_dispatcher.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -13,12 +13,12 @@
 #include "base/memory/platform_shared_memory_region.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/writable_shared_memory_region.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/platform_shared_memory_mapping.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/platform_shared_memory_mapping.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 // NOTE(vtl): There's currently not much to test for in
@@ -37,9 +37,8 @@
   // Nothing to check for flags.
 
   MojoCreateSharedBufferOptions revalidated_options = {};
-  EXPECT_EQ(MOJO_RESULT_OK,
-            SharedBufferDispatcher::ValidateCreateOptions(
-                &validated_options, &revalidated_options));
+  EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::ValidateCreateOptions(
+                                &validated_options, &revalidated_options));
   EXPECT_EQ(validated_options.struct_size, revalidated_options.struct_size);
   EXPECT_EQ(validated_options.flags, revalidated_options.flags);
 }
@@ -76,9 +75,8 @@
           flags                  // |flags|.
       };
       MojoCreateSharedBufferOptions validated_options = {};
-      EXPECT_EQ(MOJO_RESULT_OK,
-                SharedBufferDispatcher::ValidateCreateOptions(
-                    &options, &validated_options))
+      EXPECT_EQ(MOJO_RESULT_OK, SharedBufferDispatcher::ValidateCreateOptions(
+                                    &options, &validated_options))
           << capacity;
       RevalidateCreateOptions(validated_options);
       EXPECT_EQ(options.flags, validated_options.flags);
@@ -95,8 +93,7 @@
     };
     MojoCreateSharedBufferOptions unused;
     EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-              SharedBufferDispatcher::ValidateCreateOptions(
-                  &options, &unused));
+              SharedBufferDispatcher::ValidateCreateOptions(&options, &unused));
   }
 
   // Unknown |flags|.
@@ -107,8 +104,7 @@
     };
     MojoCreateSharedBufferOptions unused;
     EXPECT_EQ(MOJO_RESULT_UNIMPLEMENTED,
-              SharedBufferDispatcher::ValidateCreateOptions(
-                  &options, &unused));
+              SharedBufferDispatcher::ValidateCreateOptions(&options, &unused));
   }
 }
 
@@ -195,8 +191,8 @@
 
   // Duplicate |dispatcher1| and then close it.
   scoped_refptr<Dispatcher> dispatcher2;
-  EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle(
-                                nullptr, &dispatcher2));
+  EXPECT_EQ(MOJO_RESULT_OK,
+            dispatcher1->DuplicateBufferHandle(nullptr, &dispatcher2));
   ASSERT_TRUE(dispatcher2);
   EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType());
 
@@ -340,5 +336,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/shared_buffer_unittest.cc b/mojo/core/shared_buffer_unittest.cc
similarity index 97%
rename from mojo/edk/system/shared_buffer_unittest.cc
rename to mojo/core/shared_buffer_unittest.cc
index 2e09b60..58a0b88 100644
--- a/mojo/edk/system/shared_buffer_unittest.cc
+++ b/mojo/core/shared_buffer_unittest.cc
@@ -10,14 +10,15 @@
 #include "base/logging.h"
 #include "base/memory/shared_memory.h"
 #include "base/strings/string_piece.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/shared_buffer_dispatcher.h"
-#include "mojo/edk/test/mojo_test_base.h"
+#include "build/build_config.h"
+#include "mojo/core/core.h"
+#include "mojo/core/shared_buffer_dispatcher.h"
+#include "mojo/core/test/mojo_test_base.h"
 #include "mojo/public/c/system/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 using SharedBufferTest = test::MojoTestBase;
@@ -318,5 +319,5 @@
 #endif  // !defined(OS_IOS)
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/signals_unittest.cc b/mojo/core/signals_unittest.cc
similarity index 98%
rename from mojo/edk/system/signals_unittest.cc
rename to mojo/core/signals_unittest.cc
index 34f2105e..0678caa 100644
--- a/mojo/edk/system/signals_unittest.cc
+++ b/mojo/core/signals_unittest.cc
@@ -2,7 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/test/mojo_test_base.h"
+#include "build/build_config.h"
+#include "mojo/core/test/mojo_test_base.h"
 #include "mojo/public/c/system/buffer.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/functions.h"
@@ -11,7 +12,7 @@
 #include "mojo/public/c/system/types.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 using SignalsTest = test::MojoTestBase;
@@ -208,5 +209,5 @@
 #endif  // !defined(OS_IOS)
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/system_impl_export.h b/mojo/core/system_impl_export.h
similarity index 81%
rename from mojo/edk/system/system_impl_export.h
rename to mojo/core/system_impl_export.h
index 98ee98e5..b55acbc2 100644
--- a/mojo/edk/system/system_impl_export.h
+++ b/mojo/core/system_impl_export.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_SYSTEM_IMPL_EXPORT_H_
-#define MOJO_EDK_SYSTEM_SYSTEM_IMPL_EXPORT_H_
+#ifndef MOJO_CORE_SYSTEM_IMPL_EXPORT_H_
+#define MOJO_CORE_SYSTEM_IMPL_EXPORT_H_
 
-#if defined(MOJO_CORE_IMPL)
+#if defined(MOJO_CORE_SHARED_LIBRARY)
 #define MOJO_SYSTEM_IMPL_EXPORT
 #else
 #if defined(COMPONENT_BUILD)
@@ -30,4 +30,4 @@
 #endif
 #endif
 
-#endif  // MOJO_EDK_SYSTEM_SYSTEM_IMPL_EXPORT_H_
+#endif  // MOJO_CORE_SYSTEM_IMPL_EXPORT_H_
diff --git a/mojo/edk/test/BUILD.gn b/mojo/core/test/BUILD.gn
similarity index 92%
rename from mojo/edk/test/BUILD.gn
rename to mojo/core/test/BUILD.gn
index 9a85e716..6fad6fe 100644
--- a/mojo/edk/test/BUILD.gn
+++ b/mojo/core/test/BUILD.gn
@@ -25,7 +25,7 @@
   public_deps = [
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/system",
     "//testing/gtest",
   ]
@@ -42,7 +42,7 @@
     ":test_support_impl",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/c/test_support",
     "//testing/gtest",
   ]
@@ -58,8 +58,8 @@
     ":test_support_impl",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
-    "//mojo/edk/test:test_support",
+    "//mojo/core/embedder",
+    "//mojo/core/test:test_support",
     "//mojo/public/c/test_support",
   ]
 
diff --git a/mojo/edk/test/mojo_test_base.cc b/mojo/core/test/mojo_test_base.cc
similarity index 96%
rename from mojo/edk/test/mojo_test_base.cc
rename to mojo/core/test/mojo_test_base.cc
index 52df0b7..53f7101 100644
--- a/mojo/edk/test/mojo_test_base.cc
+++ b/mojo/core/test/mojo_test_base.cc
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/test/mojo_test_base.h"
+#include "mojo/core/test/mojo_test_base.h"
 
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/synchronization/waitable_event.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "build/build_config.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/c/system/buffer.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/functions.h"
@@ -23,7 +24,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
@@ -51,10 +52,9 @@
   return *clients_.back();
 }
 
-MojoTestBase::ClientController::ClientController(
-    const std::string& client_name,
-    MojoTestBase* test,
-    LaunchType launch_type) {
+MojoTestBase::ClientController::ClientController(const std::string& client_name,
+                                                 MojoTestBase* test,
+                                                 LaunchType launch_type) {
 #if !defined(OS_IOS)
 #if defined(OS_MACOSX)
   // This lock needs to be held while launching the child because the Mach port
@@ -304,5 +304,5 @@
 }
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/test/mojo_test_base.h b/mojo/core/test/mojo_test_base.h
similarity index 94%
rename from mojo/edk/test/mojo_test_base.h
rename to mojo/core/test/mojo_test_base.h
index 1ff73f3f..8110cfc 100644
--- a/mojo/edk/test/mojo_test_base.h
+++ b/mojo/core/test/mojo_test_base.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 MOJO_EDK_TEST_MOJO_TEST_BASE_H_
-#define MOJO_EDK_TEST_MOJO_TEST_BASE_H_
+#ifndef MOJO_CORE_TEST_MOJO_TEST_BASE_H_
+#define MOJO_CORE_TEST_MOJO_TEST_BASE_H_
 
 #include <memory>
 #include <string>
@@ -14,14 +14,15 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
+#include "build/build_config.h"
+#include "mojo/core/test/multiprocess_test_helper.h"
 #include "mojo/public/c/system/trap.h"
 #include "mojo/public/c/system/types.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 class MojoTestBase : public testing::Test {
@@ -193,9 +194,9 @@
   };                                                                    \
   MULTIPROCESS_TEST_MAIN_WITH_SETUP(                                    \
       client_name##TestChildMain,                                       \
-      ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {          \
+      ::mojo::core::test::MultiprocessTestHelper::ChildSetup) {         \
     client_name##_MainFixture test;                                     \
-    return ::mojo::edk::test::MultiprocessTestHelper::RunClientMain(    \
+    return ::mojo::core::test::MultiprocessTestHelper::RunClientMain(   \
         base::Bind(&client_name##_MainFixture::Main,                    \
                    base::Unretained(&test)));                           \
   }                                                                     \
@@ -212,9 +213,9 @@
   };                                                                         \
   MULTIPROCESS_TEST_MAIN_WITH_SETUP(                                         \
       client_name##TestChildMain,                                            \
-      ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {               \
+      ::mojo::core::test::MultiprocessTestHelper::ChildSetup) {              \
     client_name##_MainFixture test;                                          \
-    return ::mojo::edk::test::MultiprocessTestHelper::RunClientTestMain(     \
+    return ::mojo::core::test::MultiprocessTestHelper::RunClientTestMain(    \
         base::Bind(&client_name##_MainFixture::Main,                         \
                    base::Unretained(&test)));                                \
   }                                                                          \
@@ -225,7 +226,7 @@
 #endif  // !defined(OS_IOS)
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_TEST_MOJO_TEST_BASE_H_
+#endif  // MOJO_CORE_TEST_MOJO_TEST_BASE_H_
diff --git a/mojo/edk/test/multiprocess_test_helper.cc b/mojo/core/test/multiprocess_test_helper.cc
similarity index 98%
rename from mojo/edk/test/multiprocess_test_helper.cc
rename to mojo/core/test/multiprocess_test_helper.cc
index 4e1d8f7..7181520 100644
--- a/mojo/edk/test/multiprocess_test_helper.cc
+++ b/mojo/core/test/multiprocess_test_helper.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 "mojo/edk/test/multiprocess_test_helper.h"
+#include "mojo/core/test/multiprocess_test_helper.h"
 
 #include <functional>
 #include <set>
@@ -40,7 +40,7 @@
 #endif
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 namespace {
@@ -272,5 +272,5 @@
 mojo::ScopedMessagePipeHandle MultiprocessTestHelper::primordial_pipe;
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/test/multiprocess_test_helper.h b/mojo/core/test/multiprocess_test_helper.h
similarity index 91%
rename from mojo/edk/test/multiprocess_test_helper.h
rename to mojo/core/test/multiprocess_test_helper.h
index 07a03518..e7be8355 100644
--- a/mojo/edk/test/multiprocess_test_helper.h
+++ b/mojo/core/test/multiprocess_test_helper.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 MOJO_EDK_TEST_MULTIPROCESS_TEST_HELPER_H_
-#define MOJO_EDK_TEST_MULTIPROCESS_TEST_HELPER_H_
+#ifndef MOJO_CORE_TEST_MULTIPROCESS_TEST_HELPER_H_
+#define MOJO_CORE_TEST_MULTIPROCESS_TEST_HELPER_H_
 
 #include <string>
 
@@ -19,7 +19,7 @@
 
 class IsolatedConnection;
 
-namespace edk {
+namespace core {
 namespace test {
 
 class MultiprocessTestHelper {
@@ -76,7 +76,7 @@
 
   const base::Process& test_child() const { return test_child_; }
 
-  // Used by macros in mojo/edk/test/mojo_test_base.h to support multiprocess
+  // Used by macros in mojo/core/test/mojo_test_base.h to support multiprocess
   // test client initialization.
   static void ChildSetup();
   static int RunClientMain(const base::Callback<int(MojoHandle)>& main,
@@ -96,7 +96,7 @@
 };
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_TEST_MULTIPROCESS_TEST_HELPER_H_
+#endif  // MOJO_CORE_TEST_MULTIPROCESS_TEST_HELPER_H_
diff --git a/mojo/core/test/run_all_perftests.cc b/mojo/core/test/run_all_perftests.cc
new file mode 100644
index 0000000..2f86cc07
--- /dev/null
+++ b/mojo/core/test/run_all_perftests.cc
@@ -0,0 +1,26 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/command_line.h"
+#include "base/test/multiprocess_test.h"
+#include "base/test/perf_test_suite.h"
+#include "base/test/test_io_thread.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
+#include "mojo/core/test/multiprocess_test_helper.h"
+#include "mojo/core/test/test_support_impl.h"
+#include "mojo/public/tests/test_support_private.h"
+
+int main(int argc, char** argv) {
+  base::PerfTestSuite test(argc, argv);
+
+  mojo::core::Init();
+  base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
+  mojo::core::ScopedIPCSupport ipc_support(
+      test_io_thread.task_runner(),
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+  mojo::test::TestSupport::Init(new mojo::core::test::TestSupportImpl());
+
+  return test.Run();
+}
diff --git a/mojo/edk/test/run_all_unittests.cc b/mojo/core/test/run_all_unittests.cc
similarity index 78%
rename from mojo/edk/test/run_all_unittests.cc
rename to mojo/core/test/run_all_unittests.cc
index a057825..974dfde 100644
--- a/mojo/edk/test/run_all_unittests.cc
+++ b/mojo/core/test/run_all_unittests.cc
@@ -10,10 +10,11 @@
 #include "base/test/multiprocess_test.h"
 #include "base/test/test_io_thread.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
-#include "mojo/edk/test/test_support_impl.h"
+#include "build/build_config.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
+#include "mojo/core/test/multiprocess_test_helper.h"
+#include "mojo/core/test/test_support_impl.h"
 #include "mojo/public/tests/test_support_private.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -35,14 +36,14 @@
 
   base::TestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
-  mojo::test::TestSupport::Init(new mojo::edk::test::TestSupportImpl());
+  mojo::test::TestSupport::Init(new mojo::core::test::TestSupportImpl());
   base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
 
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       test_io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
   return base::LaunchUnitTests(
       argc, argv,
       base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite)));
diff --git a/mojo/edk/test/test_support_impl.cc b/mojo/core/test/test_support_impl.cc
similarity index 93%
rename from mojo/edk/test/test_support_impl.cc
rename to mojo/core/test/test_support_impl.cc
index 50a5353..f2fd5c5 100644
--- a/mojo/edk/test/test_support_impl.cc
+++ b/mojo/core/test/test_support_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/test/test_support_impl.h"
+#include "mojo/core/test/test_support_impl.h"
 
 #include <stddef.h>
 #include <stdlib.h>
@@ -21,7 +21,7 @@
 #include "base/test/perf_log.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 namespace {
 
@@ -41,11 +41,9 @@
 
 }  // namespace
 
-TestSupportImpl::TestSupportImpl() {
-}
+TestSupportImpl::TestSupportImpl() {}
 
-TestSupportImpl::~TestSupportImpl() {
-}
+TestSupportImpl::~TestSupportImpl() {}
 
 void TestSupportImpl::LogPerfResult(const char* test_name,
                                     const char* sub_test_name,
@@ -80,5 +78,5 @@
 }
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/test/test_support_impl.h b/mojo/core/test/test_support_impl.h
similarity index 83%
rename from mojo/edk/test/test_support_impl.h
rename to mojo/core/test/test_support_impl.h
index ebb5ce6..1047e912 100644
--- a/mojo/edk/test/test_support_impl.h
+++ b/mojo/core/test/test_support_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_TEST_TEST_SUPPORT_IMPL_H_
-#define MOJO_EDK_TEST_TEST_SUPPORT_IMPL_H_
+#ifndef MOJO_CORE_TEST_TEST_SUPPORT_IMPL_H_
+#define MOJO_CORE_TEST_TEST_SUPPORT_IMPL_H_
 
 #include <stdio.h>
 
@@ -11,7 +11,7 @@
 #include "mojo/public/tests/test_support_private.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 class TestSupportImpl : public mojo::test::TestSupport {
@@ -32,7 +32,7 @@
 };
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_TEST_TEST_SUPPORT_IMPL_H_
+#endif  // MOJO_CORE_TEST_TEST_SUPPORT_IMPL_H_
diff --git a/mojo/edk/test/test_utils.cc b/mojo/core/test/test_utils.cc
similarity index 90%
rename from mojo/edk/test/test_utils.cc
rename to mojo/core/test/test_utils.cc
index 1ad281e..28aee0e 100644
--- a/mojo/edk/test/test_utils.cc
+++ b/mojo/core/test/test_utils.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 "mojo/edk/test/test_utils.h"
+#include "mojo/core/test/test_utils.h"
 
 #include <fcntl.h>
 #include <stddef.h>
@@ -11,7 +11,7 @@
 #include "base/posix/eintr_wrapper.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 PlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp) {
@@ -29,5 +29,5 @@
 }
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/test/test_utils.h b/mojo/core/test/test_utils.h
similarity index 81%
rename from mojo/edk/test/test_utils.h
rename to mojo/core/test/test_utils.h
index 6576d5c..8e4385d 100644
--- a/mojo/edk/test/test_utils.h
+++ b/mojo/core/test/test_utils.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 MOJO_EDK_TEST_TEST_UTILS_H_
-#define MOJO_EDK_TEST_TEST_UTILS_H_
+#ifndef MOJO_CORE_TEST_TEST_UTILS_H_
+#define MOJO_CORE_TEST_TEST_UTILS_H_
 
 #include <stddef.h>
 #include <stdio.h>
@@ -14,7 +14,7 @@
 #include "mojo/public/cpp/platform/platform_handle.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 // Gets a (scoped) |PlatformHandle| from the given (scoped) |FILE|.
@@ -24,7 +24,7 @@
 base::ScopedFILE FILEFromPlatformHandle(PlatformHandle h, const char* mode);
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_TEST_TEST_UTILS_H_
+#endif  // MOJO_CORE_TEST_TEST_UTILS_H_
diff --git a/mojo/edk/test/test_utils_win.cc b/mojo/core/test/test_utils_win.cc
similarity index 93%
rename from mojo/edk/test/test_utils_win.cc
rename to mojo/core/test/test_utils_win.cc
index 7f6d706..9adfb7a 100644
--- a/mojo/edk/test/test_utils_win.cc
+++ b/mojo/core/test/test_utils_win.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/test/test_utils.h"
+#include "mojo/core/test/test_utils.h"
 
-#include <windows.h>
 #include <fcntl.h>
 #include <io.h>
 #include <stddef.h>
 #include <string.h>
+#include <windows.h>
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 PlatformHandle PlatformHandleFromFILE(base::ScopedFILE fp) {
@@ -45,5 +45,5 @@
 }
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/test_utils.cc b/mojo/core/test_utils.cc
similarity index 93%
rename from mojo/edk/system/test_utils.cc
rename to mojo/core/test_utils.cc
index 4a39cf73..33ce9ea 100644
--- a/mojo/edk/system/test_utils.cc
+++ b/mojo/core/test_utils.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 "mojo/edk/system/test_utils.h"
+#include "mojo/core/test_utils.h"
 
 #include <stdint.h>
 
@@ -14,7 +14,7 @@
 #include "build/build_config.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 MojoDeadline DeadlineFromMilliseconds(unsigned milliseconds) {
@@ -54,11 +54,9 @@
       base::TimeDelta::FromMicroseconds(static_cast<int64_t>(deadline)));
 }
 
-Stopwatch::Stopwatch() {
-}
+Stopwatch::Stopwatch() {}
 
-Stopwatch::~Stopwatch() {
-}
+Stopwatch::~Stopwatch() {}
 
 void Stopwatch::Start() {
   start_time_ = base::TimeTicks::Now();
@@ -72,5 +70,5 @@
 }
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/test_utils.h b/mojo/core/test_utils.h
similarity index 90%
rename from mojo/edk/system/test_utils.h
rename to mojo/core/test_utils.h
index 1c90dc17..98ac51e1 100644
--- a/mojo/edk/system/test_utils.h
+++ b/mojo/core/test_utils.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 MOJO_EDK_SYSTEM_TEST_UTILS_H_
-#define MOJO_EDK_SYSTEM_TEST_UTILS_H_
+#ifndef MOJO_CORE_TEST_UTILS_H_
+#define MOJO_CORE_TEST_UTILS_H_
 
 #include "base/macros.h"
 #include "base/time/time.h"
@@ -11,7 +11,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace test {
 
 MojoDeadline DeadlineFromMilliseconds(unsigned milliseconds);
@@ -53,7 +53,7 @@
 };
 
 }  // namespace test
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_TEST_UTILS_H_
+#endif  // MOJO_CORE_TEST_UTILS_H_
diff --git a/mojo/edk/system/trap_unittest.cc b/mojo/core/trap_unittest.cc
similarity index 99%
rename from mojo/edk/system/trap_unittest.cc
rename to mojo/core/trap_unittest.cc
index 011f988..376de62 100644
--- a/mojo/edk/system/trap_unittest.cc
+++ b/mojo/core/trap_unittest.cc
@@ -17,14 +17,14 @@
 #include "base/threading/platform_thread.h"
 #include "base/threading/simple_thread.h"
 #include "base/time/time.h"
-#include "mojo/edk/test/mojo_test_base.h"
+#include "mojo/core/test/mojo_test_base.h"
 #include "mojo/public/c/system/data_pipe.h"
 #include "mojo/public/c/system/trap.h"
 #include "mojo/public/c/system/types.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 namespace {
 
 // TODO(https://crbug.com/819046): These are temporary wrappers to reduce
@@ -1864,5 +1864,5 @@
 }
 
 }  // namespace
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/user_message_impl.cc b/mojo/core/user_message_impl.cc
similarity index 98%
rename from mojo/edk/system/user_message_impl.cc
rename to mojo/core/user_message_impl.cc
index 78d93fc2..a02356f 100644
--- a/mojo/edk/system/user_message_impl.cc
+++ b/mojo/core/user_message_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/user_message_impl.h"
+#include "mojo/core/user_message_impl.h"
 
 #include <algorithm>
 #include <vector>
@@ -17,16 +17,16 @@
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/memory_dump_provider.h"
 #include "base/trace_event/trace_event.h"
-#include "mojo/edk/system/core.h"
-#include "mojo/edk/system/node_channel.h"
-#include "mojo/edk/system/node_controller.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/message_filter.h"
-#include "mojo/edk/system/ports/node.h"
+#include "mojo/core/core.h"
+#include "mojo/core/node_channel.h"
+#include "mojo/core/node_controller.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/message_filter.h"
+#include "mojo/core/ports/node.h"
 #include "mojo/public/c/system/types.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 namespace {
 
@@ -676,5 +676,5 @@
   return result == MOJO_RESULT_OK || result == MOJO_RESULT_FAILED_PRECONDITION;
 }
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/user_message_impl.h b/mojo/core/user_message_impl.h
similarity index 93%
rename from mojo/edk/system/user_message_impl.h
rename to mojo/core/user_message_impl.h
index 6a91e64f..7988dc2 100644
--- a/mojo/edk/system/user_message_impl.h
+++ b/mojo/core/user_message_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_USER_MESSAGE_IMPL_H_
-#define MOJO_EDK_SYSTEM_USER_MESSAGE_IMPL_H_
+#ifndef MOJO_CORE_USER_MESSAGE_IMPL_H_
+#define MOJO_CORE_USER_MESSAGE_IMPL_H_
 
 #include <memory>
 #include <utility>
@@ -11,18 +11,18 @@
 
 #include "base/macros.h"
 #include "base/optional.h"
-#include "mojo/edk/system/channel.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/ports/event.h"
-#include "mojo/edk/system/ports/name.h"
-#include "mojo/edk/system/ports/port_ref.h"
-#include "mojo/edk/system/ports/user_message.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/channel.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/ports/event.h"
+#include "mojo/core/ports/name.h"
+#include "mojo/core/ports/port_ref.h"
+#include "mojo/core/ports/user_message.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/c/system/message_pipe.h"
 #include "mojo/public/c/system/types.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // UserMessageImpl is the sole implementation of ports::UserMessage used to
 // attach message data to any ports::UserMessageEvent.
@@ -211,7 +211,7 @@
   DISALLOW_COPY_AND_ASSIGN(UserMessageImpl);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_USER_MESSAGE_IMPL_H_
+#endif  // MOJO_CORE_USER_MESSAGE_IMPL_H_
diff --git a/mojo/edk/system/watch.cc b/mojo/core/watch.cc
similarity index 94%
rename from mojo/edk/system/watch.cc
rename to mojo/core/watch.cc
index bc1d843..996f0a7 100644
--- a/mojo/edk/system/watch.cc
+++ b/mojo/core/watch.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/watch.h"
+#include "mojo/core/watch.h"
 
-#include "mojo/edk/system/request_context.h"
-#include "mojo/edk/system/watcher_dispatcher.h"
+#include "mojo/core/request_context.h"
+#include "mojo/core/watcher_dispatcher.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 Watch::Watch(const scoped_refptr<WatcherDispatcher>& watcher,
              const scoped_refptr<Dispatcher>& dispatcher,
@@ -86,5 +86,5 @@
 }
 #endif
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/watch.h b/mojo/core/watch.h
similarity index 94%
rename from mojo/edk/system/watch.h
rename to mojo/core/watch.h
index 07d6169..b2a81658 100644
--- a/mojo/edk/system/watch.h
+++ b/mojo/core/watch.h
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_WATCH_H_
-#define MOJO_EDK_SYSTEM_WATCH_H_
+#ifndef MOJO_CORE_WATCH_H_
+#define MOJO_CORE_WATCH_H_
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/atomic_flag.h"
-#include "mojo/edk/system/handle_signals_state.h"
+#include "mojo/core/atomic_flag.h"
+#include "mojo/core/handle_signals_state.h"
 #include "mojo/public/c/system/trap.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class Dispatcher;
 class WatcherDispatcher;
@@ -121,7 +121,7 @@
   DISALLOW_COPY_AND_ASSIGN(Watch);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_WATCH_H_
+#endif  // MOJO_CORE_WATCH_H_
diff --git a/mojo/edk/system/watcher_dispatcher.cc b/mojo/core/watcher_dispatcher.cc
similarity index 98%
rename from mojo/edk/system/watcher_dispatcher.cc
rename to mojo/core/watcher_dispatcher.cc
index 6e8a442..0c880f6 100644
--- a/mojo/edk/system/watcher_dispatcher.cc
+++ b/mojo/core/watcher_dispatcher.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 "mojo/edk/system/watcher_dispatcher.h"
+#include "mojo/core/watcher_dispatcher.h"
 
 #include <algorithm>
 #include <limits>
@@ -10,10 +10,10 @@
 #include "base/debug/alias.h"
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "mojo/edk/system/watch.h"
+#include "mojo/core/watch.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 WatcherDispatcher::WatcherDispatcher(MojoTrapEventHandler handler)
     : handler_(handler) {}
@@ -261,5 +261,5 @@
 
 WatcherDispatcher::~WatcherDispatcher() = default;
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/watcher_dispatcher.h b/mojo/core/watcher_dispatcher.h
similarity index 91%
rename from mojo/edk/system/watcher_dispatcher.h
rename to mojo/core/watcher_dispatcher.h
index 3048a58..2f106f6 100644
--- a/mojo/edk/system/watcher_dispatcher.h
+++ b/mojo/core/watcher_dispatcher.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 MOJO_EDK_SYSTEM_WATCHER_DISPATCHER_H_
-#define MOJO_EDK_SYSTEM_WATCHER_DISPATCHER_H_
+#ifndef MOJO_CORE_WATCHER_DISPATCHER_H_
+#define MOJO_CORE_WATCHER_DISPATCHER_H_
 
 #include <stdint.h>
 
@@ -13,13 +13,13 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/lock.h"
-#include "mojo/edk/system/dispatcher.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/system_impl_export.h"
+#include "mojo/core/dispatcher.h"
+#include "mojo/core/handle_signals_state.h"
+#include "mojo/core/system_impl_export.h"
 #include "mojo/public/c/system/trap.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 class Watch;
 
@@ -98,7 +98,7 @@
   DISALLOW_COPY_AND_ASSIGN(WatcherDispatcher);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_WATCHER_DISPATCHER_H_
+#endif  // MOJO_CORE_WATCHER_DISPATCHER_H_
diff --git a/mojo/edk/system/watcher_set.cc b/mojo/core/watcher_set.cc
similarity index 96%
rename from mojo/edk/system/watcher_set.cc
rename to mojo/core/watcher_set.cc
index 0355b58..98aa1af 100644
--- a/mojo/edk/system/watcher_set.cc
+++ b/mojo/core/watcher_set.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/system/watcher_set.h"
+#include "mojo/core/watcher_set.h"
 
 #include <utility>
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 WatcherSet::WatcherSet(Dispatcher* owner) : owner_(owner) {}
 
@@ -78,5 +78,5 @@
 
 WatcherSet::Entry& WatcherSet::Entry::operator=(Entry&& other) = default;
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
diff --git a/mojo/edk/system/watcher_set.h b/mojo/core/watcher_set.h
similarity index 87%
rename from mojo/edk/system/watcher_set.h
rename to mojo/core/watcher_set.h
index 77ddd88..6abd43e0 100644
--- a/mojo/edk/system/watcher_set.h
+++ b/mojo/core/watcher_set.h
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef MOJO_EDK_SYSTEM_WATCHER_SET_H_
-#define MOJO_EDK_SYSTEM_WATCHER_SET_H_
+#ifndef MOJO_CORE_WATCHER_SET_H_
+#define MOJO_CORE_WATCHER_SET_H_
 
 #include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
-#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/watcher_dispatcher.h"
+#include "mojo/core/handle_signals_state.h"
+#include "mojo/core/watcher_dispatcher.h"
 
 namespace mojo {
-namespace edk {
+namespace core {
 
 // A WatcherSet maintains a set of references to WatcherDispatchers to be
 // notified when a handle changes state.
@@ -64,7 +64,7 @@
   DISALLOW_COPY_AND_ASSIGN(WatcherSet);
 };
 
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
-#endif  // MOJO_EDK_SYSTEM_WATCHER_SET_H_
+#endif  // MOJO_CORE_WATCHER_SET_H_
diff --git a/mojo/edk/BUILD.gn b/mojo/edk/BUILD.gn
deleted file mode 100644
index ae98e91..0000000
--- a/mojo/edk/BUILD.gn
+++ /dev/null
@@ -1,287 +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.
-
-import("//build/config/nacl/config.gni")
-import("//testing/test.gni")
-
-# Targets should depend on this if directly referencing the |mojo::edk|
-# namespace.
-component("edk") {
-  output_name = "mojo_edk"
-
-  public = [
-    "embedder/configuration.h",
-    "embedder/embedder.h",
-    "embedder/scoped_ipc_support.h",
-  ]
-
-  sources = [
-    "embedder/embedder.cc",
-    "embedder/scoped_ipc_support.cc",
-  ]
-
-  defines = [ "IS_MOJO_EDK_EMBEDDER_IMPL" ]
-
-  public_deps = [
-    "//base",
-  ]
-
-  deps = [
-    ":edk_internal",
-    "//mojo/public/c/system",
-  ]
-}
-
-component("edk_internal") {
-  output_name = "mojo_edk_internal"
-  public_deps = [
-    ":impl_for_edk",
-  ]
-  visibility = [
-    ":edk",
-    "//mojo:*",
-    "//mojo/edk/embedder:embedder_unittests",
-    "//mojo/edk/system:test_sources",
-  ]
-}
-
-# Bits of the EDK library which do not depend on public API linkage. It is
-# not allowed for this target or any of its transitive dependencies to depend
-# on anything under //mojo/public beyond strict C type definitions.
-#
-# This is templated because it's consumed by both the ":edk" component library
-# as well as the ":mojo_core" shared library. In the former case we want to
-# export symbols, but in the latter case we don't. The template stamps out two
-# nearly identical targets which differ only in what symbols they export.
-template("core_impl_source_set") {
-  source_set(target_name) {
-    if (invoker.for_mojo_core) {
-      visibility = [ ":mojo_core" ]
-    } else {
-      visibility = [ ":edk_internal" ]
-    }
-
-    public = [
-      "embedder/configuration.h",
-      "embedder/process_error_callback.h",
-      "system/channel.h",
-      "system/configuration.h",
-      "system/connection_params.h",
-      "system/core.h",
-      "system/data_pipe_consumer_dispatcher.h",
-      "system/data_pipe_control_message.h",
-      "system/data_pipe_producer_dispatcher.h",
-      "system/dispatcher.h",
-      "system/entrypoints.h",
-      "system/handle_signals_state.h",
-      "system/handle_table.h",
-      "system/invitation_dispatcher.h",
-      "system/message_pipe_dispatcher.h",
-      "system/node_controller.h",
-      "system/options_validation.h",
-      "system/platform_handle_dispatcher.h",
-      "system/platform_handle_utils.h",
-      "system/platform_shared_memory_mapping.h",
-      "system/request_context.h",
-      "system/scoped_process_handle.h",
-      "system/shared_buffer_dispatcher.h",
-      "system/user_message_impl.h",
-    ]
-
-    sources = [
-      "system/atomic_flag.h",
-      "system/broker.h",
-      "system/broker_win.cc",
-      "system/channel.cc",
-      "system/channel_win.cc",
-      "system/configuration.cc",
-      "system/connection_params.cc",
-      "system/core.cc",
-      "system/data_pipe_consumer_dispatcher.cc",
-      "system/data_pipe_control_message.cc",
-      "system/data_pipe_producer_dispatcher.cc",
-      "system/dispatcher.cc",
-      "system/entrypoints.cc",
-      "system/handle_table.cc",
-      "system/invitation_dispatcher.cc",
-      "system/message_pipe_dispatcher.cc",
-      "system/node_channel.cc",
-      "system/node_channel.h",
-      "system/node_controller.cc",
-      "system/platform_handle_dispatcher.cc",
-      "system/platform_handle_in_transit.cc",
-      "system/platform_handle_in_transit.h",
-      "system/platform_handle_utils.cc",
-      "system/platform_shared_memory_mapping.cc",
-      "system/request_context.cc",
-      "system/scoped_process_handle.cc",
-      "system/shared_buffer_dispatcher.cc",
-      "system/user_message_impl.cc",
-      "system/watch.cc",
-      "system/watch.h",
-      "system/watcher_dispatcher.cc",
-      "system/watcher_dispatcher.h",
-      "system/watcher_set.cc",
-      "system/watcher_set.h",
-    ]
-
-    public_deps = [
-      "//base",
-      "//mojo/edk/system/ports",
-      "//mojo/public/c/system:headers",
-      "//mojo/public/cpp/platform",
-    ]
-
-    if (is_fuchsia) {
-      sources += [ "system/channel_fuchsia.cc" ]
-
-      public_deps += [ "//third_party/fuchsia-sdk:fdio" ]
-    }
-
-    if (is_posix) {
-      if (!is_nacl || is_nacl_nonsfi) {
-        sources += [
-          "system/broker_posix.cc",
-          "system/channel_posix.cc",
-        ]
-      }
-    }
-
-    if (is_mac && !is_ios) {
-      sources += [
-        "system/mach_port_relay.cc",
-        "system/mach_port_relay.h",
-      ]
-    }
-
-    if (!is_nacl || is_nacl_nonsfi) {
-      sources += [
-        "system/broker_host.cc",
-        "system/broker_host.h",
-      ]
-    }
-
-    defines = []
-    if (invoker.for_mojo_core) {
-      defines += [ "MOJO_CORE_IMPL" ]
-    } else {
-      defines += [ "MOJO_SYSTEM_IMPL_IMPLEMENTATION" ]
-    }
-
-    deps = []
-    if (is_android) {
-      deps += [ "//third_party/ashmem" ]
-    }
-    if (!is_nacl) {
-      deps += [ "//crypto" ]
-    }
-
-    if (is_win) {
-      cflags = [ "/wd4324" ]  # Structure was padded due to __declspec(align()),
-                              # which is uninteresting.
-    }
-
-    # Use target_os == "chromeos" instead of is_chromeos because we need to
-    # build NaCl targets (i.e. IRT) for ChromeOS the same as the rest of ChromeOS.
-    if (is_android || target_os == "chromeos") {
-      defines += [ "MOJO_EDK_LEGACY_PROTOCOL" ]
-    }
-  }
-}
-
-core_impl_source_set("impl_for_edk") {
-  for_mojo_core = false
-}
-
-if (is_chromeos || is_linux || is_android || is_win) {
-  core_impl_source_set("impl_for_mojo_core") {
-    for_mojo_core = true
-  }
-
-  shared_library("mojo_core") {
-    sources = [
-      "mojo_core.cc",
-    ]
-    defines = [ "MOJO_CORE_IMPL" ]
-    deps = [
-      ":impl_for_mojo_core",
-      "//mojo/public/c/system:headers",
-    ]
-    if (is_win) {
-      inputs = [
-        "mojo_core.def",
-      ]
-      ldflags = [ "/DEF:" + rebase_path("mojo_core.def", root_build_dir) ]
-    } else {
-      configs += [ ":export_only_thunks_api" ]
-    }
-  }
-
-  if (is_chromeos) {
-    if (target_cpu == "arm" || target_cpu == "arm64") {
-      android32_toolchain = "android_clang_arm"
-      android64_toolchain = "android_clang_arm64"
-    } else {
-      android32_toolchain = "android_clang_x86"
-      android64_toolchain = "android_clang_x64"
-    }
-
-    group("mojo_core_for_arc") {
-      deps = [
-        ":mojo_core_arc32",
-        ":mojo_core_arc64",
-      ]
-    }
-
-    copy("mojo_core_arc32") {
-      sources = [
-        "${root_out_dir}/${android32_toolchain}/libmojo_core.so",
-      ]
-      outputs = [
-        "${root_out_dir}/libmojo_core_arc32.so",
-      ]
-      deps = [
-        ":mojo_core(//build/toolchain/android:${android32_toolchain})",
-      ]
-    }
-
-    copy("mojo_core_arc64") {
-      sources = [
-        "${root_out_dir}/${android64_toolchain}/libmojo_core.so",
-      ]
-      outputs = [
-        "${root_out_dir}/libmojo_core_arc64.so",
-      ]
-      deps = [
-        ":mojo_core(//build/toolchain/android:${android64_toolchain})",
-      ]
-    }
-  }
-
-  config("export_only_thunks_api") {
-    ldflags =
-        [ "-Wl,--version-script=" +
-          rebase_path("//mojo/edk/export_only_thunks_api.lst", root_build_dir) ]
-  }
-
-  if (is_chromeos || is_linux || is_win) {
-    test("mojo_core_unittests") {
-      sources = [
-        "mojo_core_unittest.cc",
-        "run_all_core_unittests.cc",
-      ]
-
-      deps = [
-        "//base",
-        "//base/test:test_support",
-        "//mojo/public/c/system",
-        "//testing/gtest",
-      ]
-
-      data_deps = [
-        ":mojo_core",
-      ]
-    }
-  }
-}
diff --git a/mojo/edk/embedder/README.md b/mojo/edk/embedder/README.md
deleted file mode 100644
index af861f4..0000000
--- a/mojo/edk/embedder/README.md
+++ /dev/null
@@ -1,90 +0,0 @@
-# Mojo Embedder Development Kit (EDK)
-This document is a subset of the [Mojo documentation](/mojo/README.md).
-
-[TOC]
-
-## Overview
-
-The Mojo EDK is a (binary-unstable) API which enables a process to initialize
-and use Mojo for IPC to other processes. Note that this library is only usable
-when statically linking the EDK into your application. Applications which want
-to use a shared external copy of the Mojo implementation should instead call
-`MojoInitialize()` to initialize Mojo and IPC. See the note about `mojo_core`
-[here](/mojo/README.md#Mojo-Core-Library).
-
-Using any of the API surface in `//mojo/edk/embedder` requires a direct
-dependency on the GN `//mojo/edk` target. Headers in `mojo/edk/system` are
-reserved for internal use by the EDK only.
-
-**NOTE:** Unless you are introducing a new binary entry point into the system
-(*e.g.,* a new executable with a new `main()` definition), you probably don't
-need to know anything about the EDK API. Most processes defined in the Chrome
-repo today already fully initialize the EDK so that Mojo's other public APIs
-"just work" out of the box.
-
-## Basic Initialization
-
-In order to use Mojo in an application statically linking the EDK, it's
-necessary to call `mojo::edk::Init` exactly once:
-
-```
-#include "mojo/edk/embedder/embedder.h"
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  // Now you can create message pipes, write messages, etc
-
-  return 0;
-}
-```
-
-This enables local API calls to work, so message pipes *etc* can be created and
-used. In some cases (particuarly many unit testing scenarios) this is
-sufficient, but to support any actual multiprocess communication (e.g. sending
-or accepting Mojo invitations), a second IPC initialization step is required.
-
-## IPC Initialization
-
-Internal Mojo IPC implementation requires background TaskRunner on which it can
-watch for inbound I/O from other processes. This is configured using a
-`ScopedIPCSupport` object, which keeps IPC support alive through the extent of
-its lifetime.
-
-Typically an application will create a dedicated background thread and give its
-TaskRunner to Mojo. Note that in Chromium, we use the existing "IO thread" in
-the browser process and content child processes.
-
-```
-#include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-
-int main(int argc, char** argv) {
-  mojo::edk::Init();
-
-  base::Thread ipc_thread("ipc!");
-  ipc_thread.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
-
-  // As long as this object is alive, all Mojo API surface relevant to IPC
-  // connections is usable, and message pipes which span a process boundary will
-  // continue to function.
-  mojo::edk::ScopedIPCSupport ipc_support(
-      ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-
-  return 0;
-}
-```
-
-This process is now fully prepared to use Mojo IPC!
-
-Note that all existing process types in Chromium already perform this setup
-very early during startup.
-
-## Connecting Two Processes
-
-Once IPC is initialized, you can bootstrap connections to other processes by
-using the public
-[Invitations API](/mojo/public/cpp/system/README.md#Invitations).
diff --git a/mojo/edk/system/BUILD.gn b/mojo/edk/system/BUILD.gn
deleted file mode 100644
index 05e63d1..0000000
--- a/mojo/edk/system/BUILD.gn
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/nacl/config.gni")
-import("../../../mojo/public/tools/bindings/mojom.gni")
-
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-source_set("test_utils") {
-  testonly = true
-
-  sources = [
-    "test_utils.cc",
-    "test_utils.h",
-  ]
-
-  public_deps = [
-    "//mojo/public/c/system",
-    "//mojo/public/cpp/system",
-  ]
-
-  deps = [
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk/test:test_support",
-    "//testing/gtest:gtest",
-  ]
-}
-
-source_set("test_sources") {
-  testonly = true
-  sources = [
-    "channel_unittest.cc",
-    "core_test_base.cc",
-    "core_test_base.h",
-    "core_unittest.cc",
-    "embedder_unittest.cc",
-    "handle_table_unittest.cc",
-    "message_pipe_unittest.cc",
-    "message_unittest.cc",
-    "options_validation_unittest.cc",
-    "platform_handle_dispatcher_unittest.cc",
-    "shared_buffer_dispatcher_unittest.cc",
-    "shared_buffer_unittest.cc",
-    "signals_unittest.cc",
-    "trap_unittest.cc",
-  ]
-
-  if (!is_ios) {
-    sources += [
-      "data_pipe_unittest.cc",
-      "invitation_unittest.cc",
-      "multiprocess_message_pipe_unittest.cc",
-      "platform_wrapper_unittest.cc",
-    ]
-  }
-
-  deps = [
-    ":test_utils",
-    "//base",
-    "//base/test:test_support",
-    "//mojo/edk",
-    "//mojo/edk:edk_internal",
-    "//mojo/edk/system/ports:tests",
-    "//mojo/edk/test:run_all_unittests",
-    "//mojo/edk/test:test_support",
-    "//mojo/public/cpp/system",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-}
diff --git a/mojo/edk/system/ports/name.h b/mojo/edk/system/ports/name.h
deleted file mode 100644
index 80d7ffc..0000000
--- a/mojo/edk/system/ports/name.h
+++ /dev/null
@@ -1,76 +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 MOJO_EDK_SYSTEM_PORTS_NAME_H_
-#define MOJO_EDK_SYSTEM_PORTS_NAME_H_
-
-#include <stdint.h>
-
-#include <ostream>
-#include <tuple>
-
-#include "base/component_export.h"
-#include "base/hash.h"
-
-namespace mojo {
-namespace edk {
-namespace ports {
-
-struct COMPONENT_EXPORT(MOJO_EDK_PORTS) Name {
-  Name(uint64_t v1, uint64_t v2) : v1(v1), v2(v2) {}
-  uint64_t v1, v2;
-};
-
-inline bool operator==(const Name& a, const Name& b) {
-  return a.v1 == b.v1 && a.v2 == b.v2;
-}
-
-inline bool operator!=(const Name& a, const Name& b) {
-  return !(a == b);
-}
-
-inline bool operator<(const Name& a, const Name& b) {
-  return std::tie(a.v1, a.v2) < std::tie(b.v1, b.v2);
-}
-
-COMPONENT_EXPORT(MOJO_EDK_PORTS)
-std::ostream& operator<<(std::ostream& stream, const Name& name);
-
-struct COMPONENT_EXPORT(MOJO_EDK_PORTS) PortName : Name {
-  PortName() : Name(0, 0) {}
-  PortName(uint64_t v1, uint64_t v2) : Name(v1, v2) {}
-};
-
-extern COMPONENT_EXPORT(MOJO_EDK_PORTS) const PortName kInvalidPortName;
-
-struct COMPONENT_EXPORT(MOJO_EDK_PORTS) NodeName : Name {
-  NodeName() : Name(0, 0) {}
-  NodeName(uint64_t v1, uint64_t v2) : Name(v1, v2) {}
-};
-
-extern COMPONENT_EXPORT(MOJO_EDK_PORTS) const NodeName kInvalidNodeName;
-
-}  // namespace ports
-}  // namespace edk
-}  // namespace mojo
-
-namespace std {
-
-template <>
-struct COMPONENT_EXPORT(MOJO_EDK_PORTS) hash<mojo::edk::ports::PortName> {
-  std::size_t operator()(const mojo::edk::ports::PortName& name) const {
-    return base::HashInts64(name.v1, name.v2);
-  }
-};
-
-template <>
-struct COMPONENT_EXPORT(MOJO_EDK_PORTS) hash<mojo::edk::ports::NodeName> {
-  std::size_t operator()(const mojo::edk::ports::NodeName& name) const {
-    return base::HashInts64(name.v1, name.v2);
-  }
-};
-
-}  // namespace std
-
-#endif  // MOJO_EDK_SYSTEM_PORTS_NAME_H_
diff --git a/mojo/edk/test/run_all_perftests.cc b/mojo/edk/test/run_all_perftests.cc
deleted file mode 100644
index 3ce3b47..0000000
--- a/mojo/edk/test/run_all_perftests.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/command_line.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/perf_test_suite.h"
-#include "base/test/test_io_thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
-#include "mojo/edk/test/multiprocess_test_helper.h"
-#include "mojo/edk/test/test_support_impl.h"
-#include "mojo/public/tests/test_support_private.h"
-
-int main(int argc, char** argv) {
-  base::PerfTestSuite test(argc, argv);
-
-  mojo::edk::Init();
-  base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
-  mojo::edk::ScopedIPCSupport ipc_support(
-      test_io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
-  mojo::test::TestSupport::Init(new mojo::edk::test::TestSupportImpl());
-
-  return test.Run();
-}
diff --git a/mojo/public/c/system/functions.h b/mojo/public/c/system/functions.h
index f59ee57..9f90c38 100644
--- a/mojo/public/c/system/functions.h
+++ b/mojo/public/c/system/functions.h
@@ -21,8 +21,8 @@
 
 // Initializes Mojo in the calling application.
 //
-// With the exception of EDK embedders, applications using Mojo APIs must call
-// this function before any others.
+// With the exception of Mojo Core embedders, applications using Mojo APIs must
+// call this function before any others.
 //
 // |options| may be null.
 //
@@ -30,8 +30,8 @@
 //   |MOJO_RESULT_OK| if Mojo intiailization was successful.
 //   |MOJO_RESULT_INVALID_ARGUMENT| if |options| was null or invalid.
 //   |MOJO_RESULT_FAILED_PRECONDITION| if |MojoInitialize()| was already called
-//       once or if the application already explicitly initialized a Mojo EDK
-//       environment.
+//       once or if the application already explicitly initialized a Mojo Core
+//       environment as an embedder.
 MOJO_SYSTEM_EXPORT MojoResult
 MojoInitialize(const struct MojoInitializeOptions* options);
 
diff --git a/mojo/public/c/system/invitation.h b/mojo/public/c/system/invitation.h
index a9642847..eb1a4a8 100644
--- a/mojo/public/c/system/invitation.h
+++ b/mojo/public/c/system/invitation.h
@@ -246,7 +246,7 @@
 // An invitation is used to invite another process to join this process's
 // IPC network. The caller must already be a member of a Mojo network, either
 // either by itself having been previously invited, or by being the Mojo broker
-// process initialized via private Mojo APIs (i.e. the EDK).
+// process initialized via the Mojo Core Embedder API.
 //
 // Invitations can have message pipes attached to them, and these message pipes
 // are used to bootstrap Mojo IPC between the inviter and the invitee. See
diff --git a/mojo/public/c/system/thunks.cc b/mojo/public/c/system/thunks.cc
index 5017b14..fe4c77c 100644
--- a/mojo/public/c/system/thunks.cc
+++ b/mojo/public/c/system/thunks.cc
@@ -443,13 +443,13 @@
 }  // extern "C"
 
 void MojoEmbedderSetSystemThunks(const MojoSystemThunks* thunks) {
-  // Assume embedders will always use matching versions of the EDK and public
-  // APIs.
+  // Assume embedders will always use matching versions of the Mojo Core and
+  // public APIs.
   DCHECK_EQ(thunks->size, sizeof(*g_thunks));
 
   // This should only have to check that the |g_thunks->size| is zero, but we
-  // have multiple EDK initializations in some test suites still. For now we
-  // allow double calls as long as they're the same thunks as before.
+  // have multiple Mojo Core initializations in some test suites still. For now
+  // we allow double calls as long as they're the same thunks as before.
   DCHECK(g_thunks->size == 0 || !memcmp(&*g_thunks, thunks, sizeof(*g_thunks)))
       << "Cannot set embedder thunks after Mojo API calls have been made.";
 
diff --git a/mojo/public/cpp/bindings/tests/BUILD.gn b/mojo/public/cpp/bindings/tests/BUILD.gn
index b54000d..82038a1 100644
--- a/mojo/public/cpp/bindings/tests/BUILD.gn
+++ b/mojo/public/cpp/bindings/tests/BUILD.gn
@@ -50,7 +50,7 @@
   deps = [
     ":mojo_public_bindings_test_utils",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
     "//mojo/public/cpp/test_support:test_utils",
@@ -134,8 +134,8 @@
 
   deps = [
     "//base/test:test_support",
-    "//mojo/edk",
-    "//mojo/edk/test:test_support",
+    "//mojo/core/embedder",
+    "//mojo/core/test:test_support",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
     "//mojo/public/cpp/test_support:test_utils",
diff --git a/mojo/public/cpp/bindings/tests/DEPS b/mojo/public/cpp/bindings/tests/DEPS
index c5af6265..2026c45 100644
--- a/mojo/public/cpp/bindings/tests/DEPS
+++ b/mojo/public/cpp/bindings/tests/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
-  "+mojo/edk",
+  "+mojo/core/embedder",
+  "+mojo/core/test",
   "+services/service_manager/public",
 ]
 
diff --git a/mojo/public/cpp/bindings/tests/binding_set_unittest.cc b/mojo/public/cpp/bindings/tests/binding_set_unittest.cc
index abc95281..67b6fb1 100644
--- a/mojo/public/cpp/bindings/tests/binding_set_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/binding_set_unittest.cc
@@ -6,7 +6,7 @@
 #include <utility>
 
 #include "base/run_loop.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/associated_binding_set.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/strong_binding_set.h"
@@ -208,7 +208,7 @@
   PingImpl impl;
 
   std::string last_received_error;
-  edk::SetDefaultProcessErrorCallback(
+  core::SetDefaultProcessErrorCallback(
       base::Bind([](std::string* out_error,
                     const std::string& error) { *out_error = error; },
                  &last_received_error));
@@ -238,14 +238,14 @@
 
   EXPECT_TRUE(bindings.empty());
 
-  edk::SetDefaultProcessErrorCallback(mojo::edk::ProcessErrorCallback());
+  core::SetDefaultProcessErrorCallback(mojo::core::ProcessErrorCallback());
 }
 
 TEST_P(BindingSetTest, BindingSetGetBadMessageCallback) {
   PingImpl impl;
 
   std::string last_received_error;
-  edk::SetDefaultProcessErrorCallback(
+  core::SetDefaultProcessErrorCallback(
       base::Bind([](std::string* out_error,
                     const std::string& error) { *out_error = error; },
                  &last_received_error));
@@ -288,14 +288,14 @@
 
   EXPECT_TRUE(bindings.empty());
 
-  edk::SetDefaultProcessErrorCallback(mojo::edk::ProcessErrorCallback());
+  core::SetDefaultProcessErrorCallback(mojo::core::ProcessErrorCallback());
 }
 
 TEST_P(BindingSetTest, BindingSetGetBadMessageCallbackOutlivesBindingSet) {
   PingImpl impl;
 
   std::string last_received_error;
-  edk::SetDefaultProcessErrorCallback(
+  core::SetDefaultProcessErrorCallback(
       base::Bind([](std::string* out_error,
                     const std::string& error) { *out_error = error; },
                  &last_received_error));
@@ -316,7 +316,7 @@
   std::move(bad_message_callback).Run("message 1");
   EXPECT_EQ("message 1", last_received_error);
 
-  edk::SetDefaultProcessErrorCallback(mojo::edk::ProcessErrorCallback());
+  core::SetDefaultProcessErrorCallback(mojo::core::ProcessErrorCallback());
 }
 
 class PingProviderImpl : public AssociatedPingProvider, public PingService {
diff --git a/mojo/public/cpp/bindings/tests/binding_unittest.cc b/mojo/public/cpp/bindings/tests/binding_unittest.cc
index 018353f..33b6a5aa 100644
--- a/mojo/public/cpp/bindings/tests/binding_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/binding_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
 #include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
@@ -482,7 +482,7 @@
       &binding));
 
   std::string received_error;
-  edk::SetDefaultProcessErrorCallback(
+  core::SetDefaultProcessErrorCallback(
       base::Bind([](std::string* out_error,
                     const std::string& error) { *out_error = error; },
                  &received_error));
@@ -493,7 +493,7 @@
   EXPECT_TRUE(called);
   EXPECT_EQ("received bad message", received_error);
 
-  edk::SetDefaultProcessErrorCallback(mojo::edk::ProcessErrorCallback());
+  core::SetDefaultProcessErrorCallback(mojo::core::ProcessErrorCallback());
 }
 
 TEST_P(BindingTest, GetBadMessageCallback) {
@@ -504,7 +504,7 @@
   ReportBadMessageCallback bad_message_callback;
 
   std::string received_error;
-  edk::SetDefaultProcessErrorCallback(
+  core::SetDefaultProcessErrorCallback(
       base::Bind([](std::string* out_error,
                     const std::string& error) { *out_error = error; },
                  &received_error));
@@ -526,7 +526,7 @@
   std::move(bad_message_callback).Run("delayed bad message");
   EXPECT_EQ("delayed bad message", received_error);
 
-  edk::SetDefaultProcessErrorCallback(mojo::edk::ProcessErrorCallback());
+  core::SetDefaultProcessErrorCallback(mojo::core::ProcessErrorCallback());
 }
 
 // StrongBindingTest -----------------------------------------------------------
diff --git a/mojo/public/cpp/bindings/tests/e2e_perftest.cc b/mojo/public/cpp/bindings/tests/e2e_perftest.cc
index 5b10071..037b3d59 100644
--- a/mojo/public/cpp/bindings/tests/e2e_perftest.cc
+++ b/mojo/public/cpp/bindings/tests/e2e_perftest.cc
@@ -14,8 +14,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/test/perf_time_logger.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/test/mojo_test_base.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/test/mojo_test_base.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -113,7 +113,7 @@
     DoPing();
 }
 
-class MojoE2EPerftest : public edk::test::MojoTestBase {
+class MojoE2EPerftest : public core::test::MojoTestBase {
  public:
   void RunTestOnTaskRunner(base::TaskRunner* runner,
                            MojoHandle client_mp,
@@ -173,7 +173,7 @@
   auto request = InterfaceRequest<test::EchoService>(
       ScopedMessagePipeHandle(MessagePipeHandle(service_mp)));
   base::RunLoop run_loop;
-  edk::GetIOTaskRunner()->PostTask(
+  core::GetIOTaskRunner()->PostTask(
       FROM_HERE,
       base::Bind(&CreateAndRunService, base::Passed(&request),
                  base::Bind(base::IgnoreResult(&base::TaskRunner::PostTask),
@@ -197,7 +197,7 @@
     MojoHandle client_mp, service_mp;
     CreateMessagePipe(&client_mp, &service_mp);
     WriteMessageWithHandles(mp, "hello", &service_mp, 1);
-    RunTestOnTaskRunner(edk::GetIOTaskRunner().get(), client_mp,
+    RunTestOnTaskRunner(core::GetIOTaskRunner().get(), client_mp,
                         "MultiProcessEchoIoThread");
   });
 }
diff --git a/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc b/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
index 220b069a..cdd9799d 100644
--- a/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/report_bad_message_unittest.cc
@@ -6,7 +6,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/message.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
@@ -62,16 +62,15 @@
   ReportBadMessageTest() {}
 
   void SetUp() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        base::Bind(&ReportBadMessageTest::OnProcessError,
-                   base::Unretained(this)));
+    mojo::core::SetDefaultProcessErrorCallback(base::Bind(
+        &ReportBadMessageTest::OnProcessError, base::Unretained(this)));
 
     impl_.BindImpl(MakeRequest(&proxy_));
   }
 
   void TearDown() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   TestBadMessages* proxy() { return proxy_.get(); }
diff --git a/mojo/public/cpp/system/README.md b/mojo/public/cpp/system/README.md
index 91a58ab..0e6d72df 100644
--- a/mojo/public/cpp/system/README.md
+++ b/mojo/public/cpp/system/README.md
@@ -443,21 +443,21 @@
 ``` cpp
 #include "base/command_line.h"
 #include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/system/invitation.h"
 #include "mojo/public/cpp/system/message_pipe.h"
 
 int main(int argc, char** argv) {
   // Basic Mojo initialization for a new process.
-  mojo::edk::Init();
+  mojo::core::Init();
   base::Thread ipc_thread("ipc!");
   ipc_thread.StartWithOptions(
       base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
 
   // Accept an invitation.
   mojo::IncomingInvitation invitation = mojo::IncomingInvitation::Accept(
diff --git a/mojo/public/cpp/system/simple_watcher.cc b/mojo/public/cpp/system/simple_watcher.cc
index 9c5017b..7b9f079 100644
--- a/mojo/public/cpp/system/simple_watcher.cc
+++ b/mojo/public/cpp/system/simple_watcher.cc
@@ -100,8 +100,8 @@
         task_runner_->RunsTasksInCurrentSequence() && weak_watcher_ &&
         weak_watcher_->is_default_task_runner_) {
       // System notifications will trigger from the task runner passed to
-      // mojo::edk::ScopedIPCSupport. In Chrome this happens to always be the
-      // default task runner for the IO thread.
+      // mojo::core::ScopedIPCSupport. In Chrome this happens to always be
+      // the default task runner for the IO thread.
       weak_watcher_->OnHandleReady(watch_id_, result, state);
     } else {
       task_runner_->PostTask(
diff --git a/mojo/public/cpp/system/tests/BUILD.gn b/mojo/public/cpp/system/tests/BUILD.gn
index 8f7c4cf1..c08f3c1 100644
--- a/mojo/public/cpp/system/tests/BUILD.gn
+++ b/mojo/public/cpp/system/tests/BUILD.gn
@@ -25,7 +25,7 @@
   deps = [
     "//base",
     "//base/test:test_support",
-    "//mojo/edk/test:test_support",
+    "//mojo/core/test:test_support",
     "//mojo/public/c/system/tests",
     "//mojo/public/cpp/platform",
     "//mojo/public/cpp/system",
diff --git a/mojo/public/tools/fuzzers/BUILD.gn b/mojo/public/tools/fuzzers/BUILD.gn
index 7b0bfd87..6953155 100644
--- a/mojo/public/tools/fuzzers/BUILD.gn
+++ b/mojo/public/tools/fuzzers/BUILD.gn
@@ -26,7 +26,7 @@
   ]
   deps = [
     ":fuzz_mojom",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
   seed_corpus = "//mojo/public/tools/fuzzers/message_corpus"
 }
@@ -41,7 +41,7 @@
     deps = [
       ":fuzz_mojom",
       "//base",
-      "//mojo/edk",
+      "//mojo/core/embedder",
     ]
   }
 }
@@ -54,7 +54,7 @@
   deps = [
     ":fuzz_mojom",
     ":mojo_fuzzer_proto",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//third_party/libprotobuf-mutator",
   ]
   seed_corpus = "//mojo/public/tools/fuzzers/mojo_parse_message_proto_corpus"
diff --git a/mojo/public/tools/fuzzers/DEPS b/mojo/public/tools/fuzzers/DEPS
index 909a833..9243dcd6 100644
--- a/mojo/public/tools/fuzzers/DEPS
+++ b/mojo/public/tools/fuzzers/DEPS
@@ -1,3 +1,3 @@
 include_rules = [
-  "+mojo/edk",
+  "+mojo/core/embedder",
 ]
diff --git a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
index b1bdb95..62d8d87 100644
--- a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
+++ b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
@@ -10,7 +10,7 @@
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task_scheduler/task_scheduler.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/tools/fuzzers/fuzz.mojom.h"
 #include "mojo/public/tools/fuzzers/fuzz_impl.h"
 
@@ -21,7 +21,7 @@
   Environment() : message_loop() {
     base::TaskScheduler::CreateAndStartWithDefaultParams(
         "MojoFuzzerMessageDumpProcess");
-    mojo::edk::Init();
+    mojo::core::Init();
   }
 
   /* Message loop to send messages on. */
diff --git a/mojo/public/tools/fuzzers/mojo_parse_message_fuzzer.cc b/mojo/public/tools/fuzzers/mojo_parse_message_fuzzer.cc
index 0adb684..ba0f150 100644
--- a/mojo/public/tools/fuzzers/mojo_parse_message_fuzzer.cc
+++ b/mojo/public/tools/fuzzers/mojo_parse_message_fuzzer.cc
@@ -5,7 +5,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/task_scheduler/task_scheduler.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/tools/fuzzers/fuzz_impl.h"
 
@@ -38,7 +38,7 @@
   Environment() : message_loop(base::MessageLoop::TYPE_UI) {
     base::TaskScheduler::CreateAndStartWithDefaultParams(
         "MojoParseMessageFuzzerProcess");
-    mojo::edk::Init();
+    mojo::core::Init();
   }
 
   /* Message loop to send and handle messages on. */
diff --git a/mojo/public/tools/fuzzers/mojo_parse_message_proto_fuzzer.cc b/mojo/public/tools/fuzzers/mojo_parse_message_proto_fuzzer.cc
index 6772541d..69c70be 100644
--- a/mojo/public/tools/fuzzers/mojo_parse_message_proto_fuzzer.cc
+++ b/mojo/public/tools/fuzzers/mojo_parse_message_proto_fuzzer.cc
@@ -8,7 +8,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/task_scheduler/task_scheduler.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/tools/fuzzers/fuzz_impl.h"
 #include "mojo/public/tools/fuzzers/mojo_fuzzer.pb.h"
@@ -49,7 +49,7 @@
   Environment() : message_loop(base::MessageLoop::TYPE_UI) {
     base::TaskScheduler::CreateAndStartWithDefaultParams(
         "MojoParseMessageFuzzerProcess");
-    mojo::edk::Init();
+    mojo::core::Init();
   }
 
   // Message loop to send and handle messages on.
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 26359e2..b4b87fa 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -5449,7 +5449,7 @@
 
   if (enable_net_mojo) {
     deps += [
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//net/dns:mojo_client",
       "//net/dns:mojo_service",
     ]
diff --git a/net/DEPS b/net/DEPS
index 14e10f9..eea74068 100644
--- a/net/DEPS
+++ b/net/DEPS
@@ -54,7 +54,7 @@
   ],
 
   "run_all_unittests\.cc": [
-    "+mojo/edk",
+    "+mojo/core/embedder",
   ],
 
   "brotli_source_stream\.cc": [
diff --git a/net/cert/caching_cert_verifier.cc b/net/cert/caching_cert_verifier.cc
index f0f5cc93..d3c5787f 100644
--- a/net/cert/caching_cert_verifier.cc
+++ b/net/cert/caching_cert_verifier.cc
@@ -4,6 +4,8 @@
 
 #include "net/cert/caching_cert_verifier.h"
 
+#include <utility>
+
 #include "base/time/time.h"
 #include "net/base/net_errors.h"
 
@@ -34,7 +36,7 @@
 int CachingCertVerifier::Verify(const CertVerifier::RequestParams& params,
                                 CRLSet* crl_set,
                                 CertVerifyResult* verify_result,
-                                const CompletionCallback& callback,
+                                CompletionOnceCallback callback,
                                 std::unique_ptr<Request>* out_req,
                                 const NetLogWithSource& net_log) {
   out_req->reset();
@@ -50,11 +52,11 @@
   }
 
   base::Time start_time = base::Time::Now();
-  CompletionCallback caching_callback = base::Bind(
+  CompletionOnceCallback caching_callback = base::BindOnce(
       &CachingCertVerifier::OnRequestFinished, base::Unretained(this), params,
-      start_time, callback, verify_result);
+      start_time, std::move(callback), verify_result);
   int result = verifier_->Verify(params, crl_set, verify_result,
-                                 caching_callback, out_req, net_log);
+                                 std::move(caching_callback), out_req, net_log);
   if (result != ERR_IO_PENDING) {
     // Synchronous completion; add directly to cache.
     AddResultToCache(params, start_time, *verify_result, result);
@@ -112,13 +114,13 @@
 
 void CachingCertVerifier::OnRequestFinished(const RequestParams& params,
                                             base::Time start_time,
-                                            const CompletionCallback& callback,
+                                            CompletionOnceCallback callback,
                                             CertVerifyResult* verify_result,
                                             int error) {
   AddResultToCache(params, start_time, *verify_result, error);
 
   // Now chain to the user's callback, which may delete |this|.
-  callback.Run(error);
+  std::move(callback).Run(error);
 }
 
 void CachingCertVerifier::AddResultToCache(
diff --git a/net/cert/caching_cert_verifier.h b/net/cert/caching_cert_verifier.h
index e74a915..387229f 100644
--- a/net/cert/caching_cert_verifier.h
+++ b/net/cert/caching_cert_verifier.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "net/base/completion_once_callback.h"
 #include "net/base/expiring_cache.h"
 #include "net/base/net_export.h"
 #include "net/cert/cert_database.h"
@@ -45,7 +46,7 @@
   int Verify(const RequestParams& params,
              CRLSet* crl_set,
              CertVerifyResult* verify_result,
-             const CompletionCallback& callback,
+             CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const NetLogWithSource& net_log) override;
 
@@ -96,7 +97,7 @@
   // cache, and then |callback| (the original caller's callback) is invoked.
   void OnRequestFinished(const RequestParams& params,
                          base::Time start_time,
-                         const CompletionCallback& callback,
+                         CompletionOnceCallback callback,
                          CertVerifyResult* verify_result,
                          int error);
 
diff --git a/net/cert/cert_verifier.h b/net/cert/cert_verifier.h
index 95866fe..7abc4071a 100644
--- a/net/cert/cert_verifier.h
+++ b/net/cert/cert_verifier.h
@@ -11,7 +11,7 @@
 
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/hash_value.h"
 #include "net/base/net_export.h"
 #include "net/cert/x509_certificate.h"
@@ -154,7 +154,7 @@
   virtual int Verify(const RequestParams& params,
                      CRLSet* crl_set,
                      CertVerifyResult* verify_result,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* out_req,
                      const NetLogWithSource& net_log) = 0;
 
diff --git a/net/cert/client_cert_verifier.h b/net/cert/client_cert_verifier.h
index 7aeffbc..5109f54f 100644
--- a/net/cert/client_cert_verifier.h
+++ b/net/cert/client_cert_verifier.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 
 namespace net {
@@ -34,7 +34,7 @@
   // Verifies the given certificate as a client certificate.
   // Returns OK if successful or an error code upon failure.
   virtual int Verify(X509Certificate* cert,
-                     const CompletionCallback& callback,
+                     CompletionOnceCallback callback,
                      std::unique_ptr<Request>* out_req) = 0;
 };
 
diff --git a/net/cert/mock_cert_verifier.cc b/net/cert/mock_cert_verifier.cc
index d0d4ed4..9659df6 100644
--- a/net/cert/mock_cert_verifier.cc
+++ b/net/cert/mock_cert_verifier.cc
@@ -43,7 +43,7 @@
 int MockCertVerifier::Verify(const RequestParams& params,
                              CRLSet* crl_set,
                              CertVerifyResult* verify_result,
-                             const CompletionCallback& callback,
+                             CompletionOnceCallback callback,
                              std::unique_ptr<Request>* out_req,
                              const NetLogWithSource& net_log) {
   RuleList::const_iterator it;
diff --git a/net/cert/mock_cert_verifier.h b/net/cert/mock_cert_verifier.h
index b5b35a1..77b403a 100644
--- a/net/cert/mock_cert_verifier.h
+++ b/net/cert/mock_cert_verifier.h
@@ -8,6 +8,7 @@
 #include <list>
 #include <memory>
 
+#include "net/base/completion_once_callback.h"
 #include "net/cert/cert_verifier.h"
 #include "net/cert/cert_verify_result.h"
 
@@ -29,7 +30,7 @@
   int Verify(const RequestParams& params,
              CRLSet* crl_set,
              CertVerifyResult* verify_result,
-             const CompletionCallback& callback,
+             CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const NetLogWithSource& net_log) override;
 
diff --git a/net/cert/mock_client_cert_verifier.cc b/net/cert/mock_client_cert_verifier.cc
index 5b7aaec6..4de56a5 100644
--- a/net/cert/mock_client_cert_verifier.cc
+++ b/net/cert/mock_client_cert_verifier.cc
@@ -24,7 +24,7 @@
 MockClientCertVerifier::~MockClientCertVerifier() = default;
 
 int MockClientCertVerifier::Verify(X509Certificate* cert,
-                                   const CompletionCallback& callback,
+                                   CompletionOnceCallback callback,
                                    std::unique_ptr<Request>* out_req) {
   for (const Rule& rule : rules_) {
     // Check just the client cert. Intermediates will be ignored.
diff --git a/net/cert/mock_client_cert_verifier.h b/net/cert/mock_client_cert_verifier.h
index d341338..81026b7 100644
--- a/net/cert/mock_client_cert_verifier.h
+++ b/net/cert/mock_client_cert_verifier.h
@@ -8,6 +8,7 @@
 #include <list>
 #include <memory>
 
+#include "net/base/completion_once_callback.h"
 #include "net/cert/client_cert_verifier.h"
 
 namespace net {
@@ -26,7 +27,7 @@
 
   // ClientCertVerifier implementation
   int Verify(X509Certificate* cert,
-             const CompletionCallback& callback,
+             CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req) override;
 
   // Sets the default return value for Verify() for certificates/hosts that do
diff --git a/net/cert/multi_threaded_cert_verifier.cc b/net/cert/multi_threaded_cert_verifier.cc
index 230fdd4..9b473a1 100644
--- a/net/cert/multi_threaded_cert_verifier.cc
+++ b/net/cert/multi_threaded_cert_verifier.cc
@@ -128,11 +128,11 @@
                             public CertVerifier::Request {
  public:
   CertVerifierRequest(CertVerifierJob* job,
-                      const CompletionCallback& callback,
+                      CompletionOnceCallback callback,
                       CertVerifyResult* verify_result,
                       const NetLogWithSource& net_log)
       : job_(job),
-        callback_(callback),
+        callback_(std::move(callback)),
         verify_result_(verify_result),
         net_log_(net_log) {
     net_log_.BeginEvent(NetLogEventType::CERT_VERIFIER_REQUEST);
@@ -173,7 +173,7 @@
 
  private:
   CertVerifierJob* job_;  // Not owned.
-  CompletionCallback callback_;
+  CompletionOnceCallback callback_;
   CertVerifyResult* verify_result_;
   const NetLogWithSource net_log_;
 };
@@ -254,11 +254,11 @@
 
   // Creates and attaches a request to the Job.
   std::unique_ptr<CertVerifierRequest> CreateRequest(
-      const CompletionCallback& callback,
+      CompletionOnceCallback callback,
       CertVerifyResult* verify_result,
       const NetLogWithSource& net_log) {
-    std::unique_ptr<CertVerifierRequest> request(
-        new CertVerifierRequest(this, callback, verify_result, net_log));
+    std::unique_ptr<CertVerifierRequest> request(new CertVerifierRequest(
+        this, std::move(callback), verify_result, net_log));
 
     request->net_log().AddEvent(
         NetLogEventType::CERT_VERIFIER_REQUEST_BOUND_TO_JOB,
@@ -351,7 +351,7 @@
 int MultiThreadedCertVerifier::Verify(const RequestParams& params,
                                       CRLSet* crl_set,
                                       CertVerifyResult* verify_result,
-                                      const CompletionCallback& callback,
+                                      CompletionOnceCallback callback,
                                       std::unique_ptr<Request>* out_req,
                                       const NetLogWithSource& net_log) {
   out_req->reset();
@@ -384,7 +384,7 @@
   }
 
   std::unique_ptr<CertVerifierRequest> request =
-      job->CreateRequest(callback, verify_result, net_log);
+      job->CreateRequest(std::move(callback), verify_result, net_log);
   *out_req = std::move(request);
   return ERR_IO_PENDING;
 }
diff --git a/net/cert/multi_threaded_cert_verifier.h b/net/cert/multi_threaded_cert_verifier.h
index a54d3fe2..13c02e7 100644
--- a/net/cert/multi_threaded_cert_verifier.h
+++ b/net/cert/multi_threaded_cert_verifier.h
@@ -17,7 +17,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/thread_checker.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_export.h"
 #include "net/cert/cert_verifier.h"
 
@@ -64,7 +64,7 @@
   int Verify(const RequestParams& params,
              CRLSet* crl_set,
              CertVerifyResult* verify_result,
-             const CompletionCallback& callback,
+             CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const NetLogWithSource& net_log) override;
 
diff --git a/net/quic/chromium/crypto/proof_verifier_chromium_test.cc b/net/quic/chromium/crypto/proof_verifier_chromium_test.cc
index cb73c41..98e28d4 100644
--- a/net/quic/chromium/crypto/proof_verifier_chromium_test.cc
+++ b/net/quic/chromium/crypto/proof_verifier_chromium_test.cc
@@ -4,8 +4,11 @@
 
 #include "net/quic/chromium/crypto/proof_verifier_chromium.h"
 
+#include <utility>
+
 #include "base/memory/ref_counted.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_status_flags.h"
 #include "net/cert/cert_verifier.h"
@@ -43,7 +46,7 @@
   int Verify(const RequestParams& params,
              CRLSet* crl_set,
              CertVerifyResult* verify_result,
-             const CompletionCallback& callback,
+             CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const NetLogWithSource& net_log) override {
     ADD_FAILURE() << "CertVerifier::Verify() should not be called";
diff --git a/net/test/run_all_unittests.cc b/net/test/run_all_unittests.cc
index 635c4099..5786dfe 100644
--- a/net/test/run_all_unittests.cc
+++ b/net/test/run_all_unittests.cc
@@ -13,7 +13,7 @@
 #include "url/url_features.h"
 
 #if !defined(OS_IOS)
-#include "mojo/edk/embedder/embedder.h"  // nogncheck
+#include "mojo/core/embedder/embedder.h"  // nogncheck
 #endif
 
 using net::internal::ClientSocketPoolBaseHelper;
@@ -58,7 +58,7 @@
   ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(false);
 
 #if !defined(OS_IOS)
-  mojo::edk::Init();
+  mojo::core::Init();
 #endif
 
   return base::LaunchUnitTests(
diff --git a/ppapi/BUILD.gn b/ppapi/BUILD.gn
index 9b7d778b..7d41dff 100644
--- a/ppapi/BUILD.gn
+++ b/ppapi/BUILD.gn
@@ -393,7 +393,7 @@
 
   deps = [
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//ppapi/proxy",
     "//ppapi/proxy:test_support",
     "//ppapi/shared_impl",
diff --git a/ppapi/nacl_irt/DEPS b/ppapi/nacl_irt/DEPS
index 0cb57a5..c47b20f 100644
--- a/ppapi/nacl_irt/DEPS
+++ b/ppapi/nacl_irt/DEPS
@@ -5,7 +5,7 @@
   # for plugins only.
   "-ppapi/cpp",
 
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
 
   # The untrusted build references the NaCl integrated runtime (IRT).
   "+native_client/src/public",
diff --git a/ppapi/nacl_irt/irt_start.cc b/ppapi/nacl_irt/irt_start.cc
index cce1c1d..bf0c708 100644
--- a/ppapi/nacl_irt/irt_start.cc
+++ b/ppapi/nacl_irt/irt_start.cc
@@ -11,7 +11,7 @@
 #include <stdint.h>
 
 #include "base/at_exit.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "native_client/src/public/chrome_main.h"
 #include "native_client/src/public/irt_core.h"
 #include "ppapi/nacl_irt/irt_interfaces.h"
@@ -35,7 +35,7 @@
                               MakeIPCHandle(NACL_CHROME_DESC_BASE + 1),
                               MakeIPCHandle(NACL_CHROME_DESC_BASE + 2));
   // The Mojo EDK must be initialized before using IPC.
-  mojo::edk::Init();
+  mojo::core::Init();
   ppapi::StartUpPlugin();
 
   nacl_irt_enter_user_code(info, chrome_irt_query);
diff --git a/ppapi/proxy/BUILD.gn b/ppapi/proxy/BUILD.gn
index 1f5e87cb..2b8db74 100644
--- a/ppapi/proxy/BUILD.gn
+++ b/ppapi/proxy/BUILD.gn
@@ -283,7 +283,7 @@
     "//gpu/command_buffer/common",
     "//gpu/ipc/common:command_buffer_traits",
     "//media:shared_memory_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//ppapi/c",
     "//ppapi/shared_impl",
     "//ui/gfx/geometry",
diff --git a/ppapi/proxy/DEPS b/ppapi/proxy/DEPS
index 1d3692ea..06e0731 100644
--- a/ppapi/proxy/DEPS
+++ b/ppapi/proxy/DEPS
@@ -20,6 +20,6 @@
 
 specific_include_rules = {
   "ppapi_perftests\.cc": [
-    "+mojo/edk/embedder/embedder.h",
+    "+mojo/core/embedder/embedder.h",
   ]
 }
diff --git a/ppapi/proxy/ppapi_perftests.cc b/ppapi/proxy/ppapi_perftests.cc
index 45b84ee..589a2f8 100644
--- a/ppapi/proxy/ppapi_perftests.cc
+++ b/ppapi/proxy/ppapi_perftests.cc
@@ -3,10 +3,10 @@
 // found in the LICENSE file.
 
 #include "base/test/perf_test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
-  mojo::edk::Init();
+  mojo::core::Init();
   return base::PerfTestSuite(argc, argv).Run();
 }
 
diff --git a/remoting/base/BUILD.gn b/remoting/base/BUILD.gn
index 19ddacd1..cc3796bd 100644
--- a/remoting/base/BUILD.gn
+++ b/remoting/base/BUILD.gn
@@ -177,7 +177,7 @@
 
   deps = [
     ":test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net:test_support",
     "//third_party/libyuv",
     "//third_party/webrtc/modules/desktop_capture:primitives",
diff --git a/remoting/base/DEPS b/remoting/base/DEPS
index 54b8b42c..7530772 100644
--- a/remoting/base/DEPS
+++ b/remoting/base/DEPS
@@ -1,7 +1,7 @@
 include_rules = [
   "+google/protobuf",
   "+google_apis",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+net",
   "+third_party/breakpad",
   "+third_party/zlib",
diff --git a/remoting/base/run_all_unittests.cc b/remoting/base/run_all_unittests.cc
index 110e0ca..fa3e6cac 100644
--- a/remoting/base/run_all_unittests.cc
+++ b/remoting/base/run_all_unittests.cc
@@ -6,8 +6,8 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
 #include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 
 int main(int argc, char** argv) {
   base::TestSuite test_suite(argc, argv);
@@ -16,10 +16,10 @@
   ipc_thread.StartWithOptions(
       base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
 
-  mojo::edk::Init();
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::Init();
+  mojo::core::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
 
   return base::LaunchUnitTests(
       argc, argv, base::Bind(&base::TestSuite::Run,
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn
index db3de12..b495ade 100644
--- a/remoting/host/BUILD.gn
+++ b/remoting/host/BUILD.gn
@@ -731,7 +731,7 @@
     }
 
     if (remoting_multi_process != 0) {
-      deps += [ "//mojo/edk" ]
+      deps += [ "//mojo/core/embedder" ]
     }
   }
 
diff --git a/remoting/host/DEPS b/remoting/host/DEPS
index 7f8164f..f53dd06 100644
--- a/remoting/host/DEPS
+++ b/remoting/host/DEPS
@@ -10,7 +10,7 @@
   "+media/base/win/mf_initializer.h",
   "+media/gpu/windows/media_foundation_video_encode_accelerator_win.h",
   "+mojo/public",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+net",
   "+remoting/codec",
   "+remoting/protocol",
@@ -33,6 +33,6 @@
 
 specific_include_rules = {
   ".*unittest\.cc": [
-    "+mojo/edk/test",
+    "+mojo/core/test",
   ],
 }
diff --git a/remoting/host/daemon_process.cc b/remoting/host/daemon_process.cc
index 9013a18..5cba93f 100644
--- a/remoting/host/daemon_process.cc
+++ b/remoting/host/daemon_process.cc
@@ -180,9 +180,9 @@
       status_monitor_(new HostStatusMonitor()),
       current_process_stats_("DaemonProcess") {
   DCHECK(caller_task_runner->BelongsToCurrentThread());
-  // TODO(sammc): On OSX, mojo::edk::SetMachPortProvider() should be called with
-  // a base::PortProvider implementation. Add it here when this code is used on
-  // OSX.
+  // TODO(sammc): On OSX, mojo::core::SetMachPortProvider() should be called
+  // with a base::PortProvider implementation. Add it here when this code is
+  // used on OSX.
 }
 
 void DaemonProcess::CreateDesktopSession(int terminal_id,
diff --git a/remoting/host/daemon_process_win.cc b/remoting/host/daemon_process_win.cc
index 7c6ac10..67491f7 100644
--- a/remoting/host/daemon_process_win.cc
+++ b/remoting/host/daemon_process_win.cc
@@ -26,7 +26,7 @@
 #include "ipc/ipc_channel_handle.h"
 #include "ipc/ipc_message.h"
 #include "ipc/ipc_message_macros.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "remoting/base/auto_thread_task_runner.h"
 #include "remoting/base/scoped_sc_handle_win.h"
 #include "remoting/host/branding.h"
@@ -112,7 +112,7 @@
   // Mojo keeps the task runner passed to it alive forever, so an
   // AutoThreadTaskRunner should not be passed to it. Otherwise, the process may
   // never shut down cleanly.
-  mojo::edk::ScopedIPCSupport ipc_support_;
+  mojo::core::ScopedIPCSupport ipc_support_;
 
   std::unique_ptr<WorkerProcessLauncher> network_launcher_;
 
@@ -131,7 +131,7 @@
     const base::Closure& stopped_callback)
     : DaemonProcess(caller_task_runner, io_task_runner, stopped_callback),
       ipc_support_(io_task_runner->task_runner(),
-                   mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST) {}
+                   mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST) {}
 
 DaemonProcessWin::~DaemonProcessWin() {
 }
diff --git a/remoting/host/desktop_process_main.cc b/remoting/host/desktop_process_main.cc
index ef97304..f42feef 100644
--- a/remoting/host/desktop_process_main.cc
+++ b/remoting/host/desktop_process_main.cc
@@ -14,7 +14,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/platform/named_platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel_endpoint.h"
@@ -53,9 +53,9 @@
       AutoThread::CreateWithType("I/O thread", ui_task_runner,
                                  base::MessageLoop::TYPE_IO);
 
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       io_task_runner->task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
   mojo::PlatformChannelEndpoint endpoint =
       mojo::PlatformChannel::RecoverPassedEndpointFromCommandLine(
           *command_line);
diff --git a/remoting/host/host_main.cc b/remoting/host/host_main.cc
index c2a4a539..025a5f5 100644
--- a/remoting/host/host_main.cc
+++ b/remoting/host/host_main.cc
@@ -29,7 +29,7 @@
 #include "remoting/host/usage_stats_consent.h"
 
 #if defined(REMOTING_MULTI_PROCESS)
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #endif  // defined(REMOTING_MULTI_PROCESS)
 
 #if defined(OS_MACOSX)
@@ -226,7 +226,7 @@
   remoting::LoadResources("");
 
 #if defined(REMOTING_MULTI_PROCESS)
-  mojo::edk::Init();
+  mojo::core::Init();
 #endif
 
   // Invoke the entry point.
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc
index da68d59..e632bd6 100644
--- a/remoting/host/remoting_me2me_host.cc
+++ b/remoting/host/remoting_me2me_host.cc
@@ -33,7 +33,7 @@
 #include "ipc/ipc_channel_proxy.h"
 #include "ipc/ipc_listener.h"
 #include "jingle/glue/thread_wrapper.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/system/invitation.h"
 #include "net/base/network_change_notifier.h"
@@ -429,7 +429,7 @@
   scoped_refptr<HostProcess> self_;
 
 #if defined(REMOTING_MULTI_PROCESS)
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
 
   // Accessed on the UI thread.
   std::unique_ptr<IPC::ChannelProxy> daemon_channel_;
@@ -491,9 +491,9 @@
   // Mojo keeps the task runner passed to it alive forever, so an
   // AutoThreadTaskRunner should not be passed to it. Otherwise, the process may
   // never shut down cleanly.
-  ipc_support_ = std::make_unique<mojo::edk::ScopedIPCSupport>(
+  ipc_support_ = std::make_unique<mojo::core::ScopedIPCSupport>(
       context_->network_task_runner()->task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
 
   auto endpoint =
       mojo::PlatformChannel::RecoverPassedEndpointFromCommandLine(*cmd_line);
diff --git a/remoting/host/security_key/BUILD.gn b/remoting/host/security_key/BUILD.gn
index 51aa9d1..5a0e95f3 100644
--- a/remoting/host/security_key/BUILD.gn
+++ b/remoting/host/security_key/BUILD.gn
@@ -60,7 +60,7 @@
   ]
   deps = [
     "//base:debugging_buildflags",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
 }
 
@@ -101,7 +101,7 @@
     ":test_support",
   ]
   deps = [
-    "//mojo/edk/test:test_support",
+    "//mojo/core/test:test_support",
   ]
 
   if (is_posix) {
diff --git a/remoting/host/security_key/remote_security_key_main.cc b/remoting/host/security_key/remote_security_key_main.cc
index a84012c..a853c30 100644
--- a/remoting/host/security_key/remote_security_key_main.cc
+++ b/remoting/host/security_key/remote_security_key_main.cc
@@ -13,8 +13,8 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "remoting/host/host_exit_codes.h"
 #include "remoting/host/logging.h"
 #include "remoting/host/security_key/security_key_ipc_client.h"
@@ -140,10 +140,10 @@
 #error Not implemented.
 #endif
 
-  mojo::edk::Init();
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::Init();
+  mojo::core::ScopedIPCSupport ipc_support(
       base::ThreadTaskRunnerHandle::Get(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
 
   base::RunLoop run_loop;
 
diff --git a/remoting/protocol/ssl_hmac_channel_authenticator.cc b/remoting/protocol/ssl_hmac_channel_authenticator.cc
index 1969528..e78926e5 100644
--- a/remoting/protocol/ssl_hmac_channel_authenticator.cc
+++ b/remoting/protocol/ssl_hmac_channel_authenticator.cc
@@ -86,7 +86,7 @@
   int Verify(const RequestParams& params,
              net::CRLSet* crl_set,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback& callback,
+             net::CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const net::NetLogWithSource& net_log) override {
     verify_result->verified_cert = params.certificate();
diff --git a/sandbox/mac/BUILD.gn b/sandbox/mac/BUILD.gn
index 654f643..fd2afe0 100644
--- a/sandbox/mac/BUILD.gn
+++ b/sandbox/mac/BUILD.gn
@@ -69,7 +69,7 @@
     ":seatbelt_proto",
     "mojom:test_interfaces",
     "//base",
-    "//mojo/edk/test:run_all_unittests",
+    "//mojo/core/test:run_all_unittests",
     "//testing/gtest",
   ]
 }
diff --git a/services/audio/BUILD.gn b/services/audio/BUILD.gn
index b6d7055..1fc53fc 100644
--- a/services/audio/BUILD.gn
+++ b/services/audio/BUILD.gn
@@ -129,7 +129,7 @@
     ":lib",
     "//base/test:test_support",
     "//media:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//services/audio/public/cpp",
     "//services/audio/public/cpp:test_support",
     "//services/audio/public/mojom",
diff --git a/services/audio/input_stream_unittest.cc b/services/audio/input_stream_unittest.cc
index fd9ab8d..11965020 100644
--- a/services/audio/input_stream_unittest.cc
+++ b/services/audio/input_stream_unittest.cc
@@ -12,7 +12,7 @@
 #include "media/audio/audio_io.h"
 #include "media/audio/mock_audio_manager.h"
 #include "media/audio/test_audio_thread.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "services/audio/stream_factory.h"
 #include "services/audio/test/mock_log.h"
@@ -122,14 +122,14 @@
   ~AudioServiceInputStreamTest() override { audio_manager_.Shutdown(); }
 
   void SetUp() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
+    mojo::core::SetDefaultProcessErrorCallback(
         base::BindRepeating(&AudioServiceInputStreamTest::BadMessageCallback,
                             base::Unretained(this)));
   }
 
   void TearDown() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   media::mojom::AudioInputStreamPtr CreateStream(bool enable_agc) {
diff --git a/services/audio/output_stream_unittest.cc b/services/audio/output_stream_unittest.cc
index 119e607..1695704 100644
--- a/services/audio/output_stream_unittest.cc
+++ b/services/audio/output_stream_unittest.cc
@@ -12,7 +12,7 @@
 #include "media/audio/audio_io.h"
 #include "media/audio/mock_audio_manager.h"
 #include "media/audio/test_audio_thread.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
 #include "services/audio/stream_factory.h"
 #include "services/audio/test/mock_log.h"
@@ -115,13 +115,13 @@
         stream_factory_(&audio_manager_),
         stream_factory_binding_(&stream_factory_,
                                 mojo::MakeRequest(&stream_factory_ptr_)) {
-    mojo::edk::SetDefaultProcessErrorCallback(bad_message_callback_.Get());
+    mojo::core::SetDefaultProcessErrorCallback(bad_message_callback_.Get());
   }
 
   ~TestEnvironment() {
     audio_manager_.Shutdown();
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   using MockDeleteCallback = base::MockCallback<OutputStream::DeleteCallback>;
diff --git a/services/device/BUILD.gn b/services/device/BUILD.gn
index 6422019..b3920dbf 100644
--- a/services/device/BUILD.gn
+++ b/services/device/BUILD.gn
@@ -105,7 +105,7 @@
     "//base/test:test_support",
     "//base/third_party/dynamic_annotations",
     "//device/base/synchronization",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//net",
     "//net:test_support",
diff --git a/services/device/geolocation/BUILD.gn b/services/device/geolocation/BUILD.gn
index 6560343..03e7230 100644
--- a/services/device/geolocation/BUILD.gn
+++ b/services/device/geolocation/BUILD.gn
@@ -67,7 +67,7 @@
 
   deps = [
     "//base",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//net",
     "//ui/gfx",
diff --git a/services/device/geolocation/public_ip_address_geolocator_unittest.cc b/services/device/geolocation/public_ip_address_geolocator_unittest.cc
index 0dc6e06..2449938 100644
--- a/services/device/geolocation/public_ip_address_geolocator_unittest.cc
+++ b/services/device/geolocation/public_ip_address_geolocator_unittest.cc
@@ -6,7 +6,7 @@
 
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/strong_binding_set.h"
 #include "net/url_request/test_url_fetcher_factory.h"
 #include "net/url_request/url_request_test_util.h"
@@ -45,7 +45,7 @@
  protected:
   void SetUp() override {
     // Intercept Mojo bad-message errors.
-    mojo::edk::SetDefaultProcessErrorCallback(
+    mojo::core::SetDefaultProcessErrorCallback(
         base::Bind(&PublicIpAddressGeolocatorTest::OnMojoBadMessage,
                    base::Unretained(this)));
 
@@ -59,8 +59,8 @@
 
   void TearDown() override {
     // Stop intercepting Mojo bad-message errors.
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   // Deal with mojo bad message.
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index 2e45760..b97ade4 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -251,7 +251,7 @@
     "//base",
     "//components/certificate_transparency",
     "//components/network_session_configurator/browser",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
     "//net",
diff --git a/services/network/ignore_errors_cert_verifier.cc b/services/network/ignore_errors_cert_verifier.cc
index 9f72e28..a682cfa 100644
--- a/services/network/ignore_errors_cert_verifier.cc
+++ b/services/network/ignore_errors_cert_verifier.cc
@@ -75,7 +75,7 @@
 int IgnoreErrorsCertVerifier::Verify(const RequestParams& params,
                                      net::CRLSet* crl_set,
                                      net::CertVerifyResult* verify_result,
-                                     const net::CompletionCallback& callback,
+                                     net::CompletionOnceCallback callback,
                                      std::unique_ptr<Request>* out_req,
                                      const net::NetLogWithSource& net_log) {
   SPKIHashSet spki_fingerprints;
@@ -131,8 +131,8 @@
     return net::OK;
   }
 
-  return verifier_->Verify(params, crl_set, verify_result, callback, out_req,
-                           net_log);
+  return verifier_->Verify(params, crl_set, verify_result, std::move(callback),
+                           out_req, net_log);
 }
 
 void IgnoreErrorsCertVerifier::set_whitelist(const SPKIHashSet& whitelist) {
diff --git a/services/network/ignore_errors_cert_verifier.h b/services/network/ignore_errors_cert_verifier.h
index 8a7c141..9300e36 100644
--- a/services/network/ignore_errors_cert_verifier.h
+++ b/services/network/ignore_errors_cert_verifier.h
@@ -60,7 +60,7 @@
   int Verify(const RequestParams& params,
              net::CRLSet* crl_set,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback& callback,
+             net::CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const net::NetLogWithSource& net_log) override;
 
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 9284ae8..721fefe 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -124,14 +124,14 @@
   int Verify(const RequestParams& params,
              net::CRLSet* crl_set,
              net::CertVerifyResult* verify_result,
-             const net::CompletionCallback& callback,
+             net::CompletionOnceCallback callback,
              std::unique_ptr<Request>* out_req,
              const net::NetLogWithSource& net_log) override {
     verify_result->Reset();
     if (!g_cert_verifier_for_testing)
       return net::ERR_FAILED;
-    return g_cert_verifier_for_testing->Verify(params, crl_set, verify_result,
-                                               callback, out_req, net_log);
+    return g_cert_verifier_for_testing->Verify(
+        params, crl_set, verify_result, std::move(callback), out_req, net_log);
   }
 };
 
diff --git a/services/network/restricted_cookie_manager_unittest.cc b/services/network/restricted_cookie_manager_unittest.cc
index 030dd18..129dbf2 100644
--- a/services/network/restricted_cookie_manager_unittest.cc
+++ b/services/network/restricted_cookie_manager_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/run_loop.h"
 #include "base/test/bind_test_util.h"
 #include "base/time/time.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "net/cookies/cookie_constants.h"
 #include "net/cookies/cookie_monster.h"
 #include "net/cookies/cookie_store.h"
@@ -93,13 +93,13 @@
   ~RestrictedCookieManagerTest() override {}
 
   void SetUp() override {
-    mojo::edk::SetDefaultProcessErrorCallback(base::BindRepeating(
+    mojo::core::SetDefaultProcessErrorCallback(base::BindRepeating(
         &RestrictedCookieManagerTest::OnBadMessage, base::Unretained(this)));
   }
 
   void TearDown() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   // Set a canonical cookie directly into the store.
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index 66f9b01a..797c07a 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -43,7 +43,8 @@
 namespace {
 constexpr size_t kDefaultAllocationSize = 512 * 1024;
 
-// Cannot use 0, because this means "default" in mojo::edk::Core::CreateDataPipe
+// Cannot use 0, because this means "default" in
+// mojo::core::Core::CreateDataPipe
 constexpr size_t kBlockedBodyAllocationSize = 1;
 
 // TODO: this duplicates some of PopulateResourceResponse in
diff --git a/services/service_manager/embedder/BUILD.gn b/services/service_manager/embedder/BUILD.gn
index 9114686f..a50bab1 100644
--- a/services/service_manager/embedder/BUILD.gn
+++ b/services/service_manager/embedder/BUILD.gn
@@ -73,7 +73,7 @@
 
     public_deps += [
       ":embedder_switches",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//services/service_manager/background:lib",
       "//services/service_manager/public/cpp/standalone_service",
       "//services/service_manager/runner:init",
diff --git a/services/service_manager/embedder/main.cc b/services/service_manager/embedder/main.cc
index 48a1c6d6..b472851 100644
--- a/services/service_manager/embedder/main.cc
+++ b/services/service_manager/embedder/main.cc
@@ -26,9 +26,9 @@
 #include "build/build_config.h"
 #include "components/tracing/common/trace_to_console.h"
 #include "components/tracing/common/tracing_switches.h"
-#include "mojo/edk/embedder/configuration.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/configuration.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "services/service_manager/embedder/main_delegate.h"
 #include "services/service_manager/embedder/process_type.h"
 #include "services/service_manager/embedder/set_process_title.h"
@@ -228,9 +228,9 @@
   base::Thread ipc_thread("IPC thread");
   ipc_thread.StartWithOptions(
       base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST);
 
   ServiceProcessLauncherDelegateImpl service_process_launcher_delegate(
       delegate);
@@ -384,7 +384,7 @@
   InitializeMac();
 #endif
 
-  mojo::edk::Configuration mojo_config;
+  mojo::core::Configuration mojo_config;
   ProcessType process_type = delegate->OverrideProcessType();
   if (process_type == ProcessType::kDefault) {
     std::string type_switch =
@@ -400,7 +400,7 @@
   }
   mojo_config.max_message_num_bytes = kMaximumMojoMessageSize;
   delegate->OverrideMojoConfiguration(&mojo_config);
-  mojo::edk::Init(mojo_config);
+  mojo::core::Init(mojo_config);
 
   ui::RegisterPathProvider();
 
diff --git a/services/service_manager/embedder/main_delegate.cc b/services/service_manager/embedder/main_delegate.cc
index aeef91e..f8090b58 100644
--- a/services/service_manager/embedder/main_delegate.cc
+++ b/services/service_manager/embedder/main_delegate.cc
@@ -32,8 +32,8 @@
   return ProcessType::kDefault;
 }
 
-void MainDelegate::OverrideMojoConfiguration(mojo::edk::Configuration* config) {
-}
+void MainDelegate::OverrideMojoConfiguration(
+    mojo::core::Configuration* config) {}
 
 std::unique_ptr<base::Value> MainDelegate::CreateServiceCatalog() {
   return nullptr;
diff --git a/services/service_manager/embedder/main_delegate.h b/services/service_manager/embedder/main_delegate.h
index 33b1b47..db8f85fc 100644
--- a/services/service_manager/embedder/main_delegate.h
+++ b/services/service_manager/embedder/main_delegate.h
@@ -10,7 +10,7 @@
 #include "base/callback_forward.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/single_thread_task_runner.h"
-#include "mojo/edk/embedder/configuration.h"
+#include "mojo/core/embedder/configuration.h"
 #include "services/service_manager/background/background_service_manager.h"
 #include "services/service_manager/embedder/process_type.h"
 #include "services/service_manager/embedder/service_manager_embedder_export.h"
@@ -75,7 +75,7 @@
   virtual ProcessType OverrideProcessType();
 
   // Allows the embedder to override the process-wide Mojop configuration.
-  virtual void OverrideMojoConfiguration(mojo::edk::Configuration* config);
+  virtual void OverrideMojoConfiguration(mojo::core::Configuration* config);
 
   // Create the service catalog to be used by the Service Manager. May return
   // null to use the default (empty) catalog, if you're into that.
diff --git a/services/service_manager/public/cpp/BUILD.gn b/services/service_manager/public/cpp/BUILD.gn
index fead87b..40125676e 100644
--- a/services/service_manager/public/cpp/BUILD.gn
+++ b/services/service_manager/public/cpp/BUILD.gn
@@ -78,7 +78,7 @@
   deps = [
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
     "//services/service_manager/background:lib",
diff --git a/services/service_manager/public/cpp/service_test.cc b/services/service_manager/public/cpp/service_test.cc
index aef6e35..1f9cccc 100644
--- a/services/service_manager/public/cpp/service_test.cc
+++ b/services/service_manager/public/cpp/service_test.cc
@@ -7,8 +7,8 @@
 #include "base/run_loop.h"
 #include "base/threading/thread.h"
 #include "base/values.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "services/service_manager/background/background_service_manager.h"
 #include "services/service_manager/public/cpp/service.h"
 #include "services/service_manager/public/cpp/service_context.h"
diff --git a/services/service_manager/public/cpp/service_test.h b/services/service_manager/public/cpp/service_test.h
index 8dec4e0..d0026e4 100644
--- a/services/service_manager/public/cpp/service_test.h
+++ b/services/service_manager/public/cpp/service_test.h
@@ -18,7 +18,7 @@
 }
 
 namespace mojo {
-namespace edk {
+namespace core {
 class ScopedIPCSupport;
 }
 }
@@ -105,7 +105,7 @@
   // See constructor.
   std::string test_name_;
   std::unique_ptr<base::Thread> ipc_thread_;
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
 
   Connector* connector_ = nullptr;
   std::string initialize_name_;
diff --git a/services/service_manager/public/cpp/standalone_service/BUILD.gn b/services/service_manager/public/cpp/standalone_service/BUILD.gn
index 37bc387a..277b3fa 100644
--- a/services/service_manager/public/cpp/standalone_service/BUILD.gn
+++ b/services/service_manager/public/cpp/standalone_service/BUILD.gn
@@ -11,7 +11,7 @@
   ]
 
   deps = [
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/platform",
     "//mojo/public/cpp/system",
     "//services/service_manager/public/cpp",
diff --git a/services/service_manager/public/cpp/standalone_service/standalone_service.cc b/services/service_manager/public/cpp/standalone_service/standalone_service.cc
index 00afe80..d49937249 100644
--- a/services/service_manager/public/cpp/standalone_service/standalone_service.cc
+++ b/services/service_manager/public/cpp/standalone_service/standalone_service.cc
@@ -13,8 +13,8 @@
 #include "base/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/system/invitation.h"
 #include "mojo/public/cpp/system/message_pipe.h"
@@ -64,16 +64,16 @@
   }
 #endif
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   base::TaskScheduler::CreateAndStartWithDefaultParams("StandaloneService");
   base::Thread io_thread("io_thread");
   io_thread.StartWithOptions(
       base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
 
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       io_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
 
   auto invitation = mojo::IncomingInvitation::Accept(
       mojo::PlatformChannel::RecoverPassedEndpointFromCommandLine(
diff --git a/services/service_manager/public/cpp/test/BUILD.gn b/services/service_manager/public/cpp/test/BUILD.gn
index 8873ab4..ae148ef 100644
--- a/services/service_manager/public/cpp/test/BUILD.gn
+++ b/services/service_manager/public/cpp/test/BUILD.gn
@@ -18,7 +18,7 @@
   deps = [
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//services/catalog:lib",
     "//services/service_manager/background:lib",
   ]
diff --git a/services/service_manager/public/cpp/test/common_initialization.cc b/services/service_manager/public/cpp/test/common_initialization.cc
index e7adb878..1f5bbd5 100644
--- a/services/service_manager/public/cpp/test/common_initialization.cc
+++ b/services/service_manager/public/cpp/test/common_initialization.cc
@@ -8,8 +8,8 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/threading/thread.h"
 #include "base/values.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "services/catalog/catalog.h"
 #include "services/service_manager/public/cpp/test/service_test_catalog.h"
 
@@ -29,19 +29,19 @@
   catalog::Catalog::SetDefaultCatalogManifest(
       service_manager::test::CreateTestCatalog());
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
 #if defined(OS_MACOSX) && !defined(OS_IOS)
-  mojo::edk::SetMachPortProvider(
+  mojo::core::SetMachPortProvider(
       service_manager::MachBroker::GetInstance()->port_provider());
 #endif
 
   base::Thread ipc_thread("IPC thread");
   ipc_thread.StartWithOptions(
       base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
-  mojo::edk::ScopedIPCSupport ipc_support(
+  mojo::core::ScopedIPCSupport ipc_support(
       ipc_thread.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
 
   return base::LaunchUnitTests(argc, argv, std::move(run_test_suite));
 }
diff --git a/services/ui/public/cpp/tests/BUILD.gn b/services/ui/public/cpp/tests/BUILD.gn
index efb40086..01be512 100644
--- a/services/ui/public/cpp/tests/BUILD.gn
+++ b/services/ui/public/cpp/tests/BUILD.gn
@@ -16,7 +16,7 @@
   deps = [
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/system",
     "//services/service_manager/public/cpp",
     "//services/ui/public/cpp",
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index eadcb12..0f8a42e 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -787,7 +787,7 @@
     ":skia",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk/test:run_all_unittests",
+    "//mojo/core/test:run_all_unittests",
     "//testing/gtest",
     "//ui/gfx",
     "//ui/gfx/geometry",
diff --git a/storage/browser/BUILD.gn b/storage/browser/BUILD.gn
index 4ea7f13..4b2d919 100644
--- a/storage/browser/BUILD.gn
+++ b/storage/browser/BUILD.gn
@@ -304,7 +304,7 @@
     ":test_support",
     "//base/test:test_support",
     "//components/services/filesystem/public/interfaces",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net:test_support",
     "//services/network/public/cpp",
     "//services/network/public/mojom",
diff --git a/storage/browser/blob/blob_registry_impl_unittest.cc b/storage/browser/blob/blob_registry_impl_unittest.cc
index efcd33934..0a39bfb 100644
--- a/storage/browser/blob/blob_registry_impl_unittest.cc
+++ b/storage/browser/blob/blob_registry_impl_unittest.cc
@@ -15,7 +15,7 @@
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_restrictions.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/cpp/system/data_pipe_utils.h"
 #include "storage/browser/blob/blob_data_builder.h"
@@ -73,7 +73,7 @@
     delegate_ptr_ = delegate.get();
     registry_impl_->Bind(MakeRequest(&registry_), std::move(delegate));
 
-    mojo::edk::SetDefaultProcessErrorCallback(base::Bind(
+    mojo::core::SetDefaultProcessErrorCallback(base::Bind(
         &BlobRegistryImplTest::OnBadMessage, base::Unretained(this)));
 
     storage::BlobStorageLimits limits;
@@ -94,8 +94,8 @@
   void TearDown() override {
     base::ThreadRestrictions::SetIOAllowed(true);
 
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   std::unique_ptr<BlobDataHandle> CreateBlobFromString(
diff --git a/storage/browser/blob/blob_transport_strategy_unittest.cc b/storage/browser/blob/blob_transport_strategy_unittest.cc
index 9349e98..3000df3 100644
--- a/storage/browser/blob/blob_transport_strategy_unittest.cc
+++ b/storage/browser/blob/blob_transport_strategy_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/task_scheduler/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_restrictions.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "storage/browser/blob/blob_data_builder.h"
 #include "storage/browser/test/mock_bytes_provider.h"
@@ -61,7 +61,7 @@
     limits_.min_page_file_size = kTestBlobStorageMinFileSizeBytes;
     limits_.max_file_size = kTestBlobStorageMaxFileSizeBytes;
 
-    mojo::edk::SetDefaultProcessErrorCallback(base::Bind(
+    mojo::core::SetDefaultProcessErrorCallback(base::Bind(
         &BlobTransportStrategyTest::OnBadMessage, base::Unretained(this)));
 
     // Disallow IO on the main loop.
@@ -71,8 +71,8 @@
   void TearDown() override {
     base::ThreadRestrictions::SetIOAllowed(true);
 
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   void OnBadMessage(const std::string& error) {
diff --git a/storage/browser/blob/blob_url_store_impl_unittest.cc b/storage/browser/blob/blob_url_store_impl_unittest.cc
index 04af813..5e0d039 100644
--- a/storage/browser/blob/blob_url_store_impl_unittest.cc
+++ b/storage/browser/blob/blob_url_store_impl_unittest.cc
@@ -6,7 +6,7 @@
 
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "services/network/public/cpp/simple_url_loader.h"
@@ -27,13 +27,13 @@
   void SetUp() override {
     context_ = std::make_unique<BlobStorageContext>();
 
-    mojo::edk::SetDefaultProcessErrorCallback(base::BindRepeating(
+    mojo::core::SetDefaultProcessErrorCallback(base::BindRepeating(
         &BlobURLStoreImplTest::OnBadMessage, base::Unretained(this)));
   }
 
   void TearDown() override {
-    mojo::edk::SetDefaultProcessErrorCallback(
-        mojo::edk::ProcessErrorCallback());
+    mojo::core::SetDefaultProcessErrorCallback(
+        mojo::core::ProcessErrorCallback());
   }
 
   void OnBadMessage(const std::string& error) {
diff --git a/storage/common/BUILD.gn b/storage/common/BUILD.gn
index 44d68d9..56863a2 100644
--- a/storage/common/BUILD.gn
+++ b/storage/common/BUILD.gn
@@ -62,7 +62,7 @@
   deps = [
     ":common",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//testing/gtest",
     "//url",
   ]
diff --git a/storage/common/run_all_unittests.cc b/storage/common/run_all_unittests.cc
index 75ad05f..a131fb2a 100644
--- a/storage/common/run_all_unittests.cc
+++ b/storage/common/run_all_unittests.cc
@@ -6,13 +6,13 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
   int result = 0;
   {
     base::TestSuite test_suite(argc, argv);
-    mojo::edk::Init();
+    mojo::core::Init();
     result = base::LaunchUnitTests(
         argc, argv,
         base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index 43645019..1fe1d79 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -1094,50 +1094,6 @@
       },
       {
         "args": [
-          "-v",
-          "--browser=release_x64",
-          "--upload-results",
-          "--run-ref-build",
-          "--test-shard-map-filename=win7_nvidia_shard_map.json"
-        ],
-        "isolate_name": "performance_test_suite",
-        "merge": {
-          "args": [
-            "--service-account-file",
-            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "performance_test_suite",
-        "override_compile_targets": [
-          "performance_test_suite"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:1cb3",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "chrome.tests.perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 36000,
-          "ignore_task_failure": false,
-          "io_timeout": 1800,
-          "shards": 5,
-          "upload_test_results": true
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
           "--non-telemetry=true",
           "--migrated-test=true",
           "--use-cmd-decoder=validating",
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index c3fdcdca..6f84982 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -845,7 +845,7 @@
     ],
   },
   "mojo_core_unittests": {
-    "label": "//mojo/edk:mojo_core_unittests",
+    "label": "//mojo/core:mojo_core_unittests",
     "type": "console_test_launcher",
   },
   "mojo_unittests": {
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 43a3ee2..3f978fc 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -8,6 +8,11 @@
 crbug.com/714962 external/wpt/css/css-transforms/transform-abspos-006.html [ Skip ]
 crbug.com/714962 external/wpt/css/css-transforms/transform-abspos-007.html [ Skip ]
 
+# Multicol enforces legacy layout. The refs do not use multicol. Legacy and NG
+# disagree on where to put line boxes in vertical-lr sometimes (off by one pixel):
+crbug.com/850504 fast/multicol/span/vertical-lr.html [ Skip ]
+crbug.com/850504 fast/multicol/vertical-lr/ [ Skip ]
+
 # Fails because we don't yet special-case marquee like legacy does:
 # https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/layout/layout_block.cc?l=1372&rcl=0e081149ecd6a83f6289e3aee5797936008a1e10
 crbug.com/591099 fast/block/marquee-width-shrinks-to-fit-in-fixed-size-container.html [ Failure ]
@@ -29,6 +34,9 @@
 # Superscript text off by 1px
 crbug.com/636993 external/wpt/css/css-text-decor/text-decoration-color.html [ Failure ]
 
+# rightsizing-grid.html is truly flaky, show flakiness on reload
+crbug.com/591099 svg/wicd/rightsizing-grid.html [ Pass Failure ]
+
 # New passes
 crbug.com/774229 editing/pasteboard/copy-paste-white-space.html [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats-clear/no-clearance-adjoining-opposite-float.html [ Pass ]
@@ -148,7 +156,7 @@
 crbug.com/591099 external/wpt/css/css-text/white-space/pre-wrap-002.html [ Pass ]
 crbug.com/40634 external/wpt/css/css-text/white-space/trailing-space-before-br-001.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/word-break/word-break-break-all-004.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-transforms/transform-transformed-tr-percent-height-child.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-transforms/transform-transformed-tr-percent-height-child.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-transforms/transform3d-perspective-008.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-ui/text-overflow-010.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-ui/text-overflow-015.html [ Failure ]
@@ -229,9 +237,9 @@
 crbug.com/591099 external/wpt/css/css-writing-modes/available-size-002.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/available-size-010.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/available-size-011.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/available-size-012.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-writing-modes/available-size-012.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/available-size-017.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/available-size-018.html [ Failure Pass ]
+crbug.com/591099 external/wpt/css/css-writing-modes/available-size-018.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/block-flow-direction-vrl-009.xht [ Pass ]
 crbug.com/591099 external/wpt/css/css-writing-modes/float-vlr-013.xht [ Failure ]
 crbug.com/591099 external/wpt/css/css-writing-modes/float-vrl-012.xht [ Failure ]
@@ -284,6 +292,7 @@
 crbug.com/591099 external/wpt/editing/run/insertparagraph.html [ Pass ]
 crbug.com/591099 external/wpt/editing/run/justifycenter.html [ Pass ]
 crbug.com/591099 external/wpt/editing/run/justifyfull.html [ Pass ]
+crbug.com/591099 external/wpt/editing/run/justifyleft.html [ Pass ]
 crbug.com/591099 external/wpt/editing/run/justifyright.html [ Pass ]
 crbug.com/591099 external/wpt/editing/run/misc.html [ Pass ]
 crbug.com/591099 external/wpt/editing/run/multitest.html [ Pass ]
@@ -329,8 +338,6 @@
 crbug.com/591099 fast/block/float/negative-margin-on-element-avoiding-floats.html [ Failure ]
 crbug.com/591099 fast/block/float/nopaint-after-layer-destruction.html [ Failure ]
 crbug.com/591099 fast/block/float/nopaint-after-layer-destruction2.html [ Failure ]
-crbug.com/810370 fast/block/float/overhanging-float-remove-from-fixed-position-block.html [ Failure ]
-crbug.com/810370 fast/block/float/overhanging-float-remove-from-fixed-position-block2.html [ Failure ]
 crbug.com/591099 fast/block/float/overlapping-floats-paint-hittest-order-1.html [ Failure ]
 crbug.com/591099 fast/block/line-layout/floats-do-not-fit-on-line.html [ Failure ]
 crbug.com/591099 fast/block/over-constrained-auto-margin.html [ Failure ]
@@ -348,7 +355,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/css-generated-content/015.html [ Failure ]
 crbug.com/591099 fast/css-generated-content/first-letter-next-sibling-crash.html [ Crash ]
 crbug.com/591099 fast/css-generated-content/float-first-letter-siblings-convert-to-inline.html [ Crash ]
@@ -415,6 +422,8 @@
 crbug.com/591099 fast/dynamic/text-combine.html [ Failure ]
 crbug.com/591099 fast/encoding/utf-16-big-endian.html [ Failure ]
 crbug.com/591099 fast/encoding/utf-16-little-endian.html [ Failure ]
+crbug.com/591099 fast/events/background-tab-on-submit-ctrl-click.html [ Failure ]
+crbug.com/591099 fast/events/background-tab-on-submit-synthesized-ctrl-click.html [ Failure ]
 crbug.com/591099 fast/events/select-element.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
 crbug.com/591099 fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ]
@@ -422,7 +431,7 @@
 crbug.com/591099 fast/forms/form-hides-table.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-initial-position.html [ Failure ]
 crbug.com/591099 fast/forms/select/select-style.html [ Failure ]
-crbug.com/591099 fast/forms/text-control-intrinsic-widths.html [ Pass Timeout ]
+crbug.com/591099 fast/forms/text-control-intrinsic-widths.html [ Timeout ]
 crbug.com/591099 fast/frames/iframe-with-frameborder.html [ Failure ]
 crbug.com/591099 fast/gradients/list-item-gradient.html [ Failure ]
 crbug.com/591099 fast/gradients/unprefixed-list-item-gradient.html [ Failure ]
@@ -448,24 +457,9 @@
 crbug.com/591099 fast/lists/list-item-line-height.html [ Failure ]
 crbug.com/591099 fast/lists/marker-before-empty-inline.html [ Failure ]
 crbug.com/591099 fast/masking/clip-path-selection.html [ Failure ]
-crbug.com/824918 fast/multicol/break-before-first-line-in-first-child.html [ Failure ]
-crbug.com/824918 fast/multicol/nested-one-line-in-inner.html [ Failure ]
-crbug.com/850504 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Failure ]
+crbug.com/850504 fast/multicol/newmulticol/hide-box-vertical-lr.html [ Skip ]
 crbug.com/591099 fast/multicol/out-of-flow/abspos-auto-position-on-line-rtl.html [ Failure ]
 crbug.com/824918 fast/multicol/span/overflow-on-multicol.html [ Failure ]
-crbug.com/850504 fast/multicol/span/vertical-lr.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/abspos-auto-position-on-line.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/column-break-with-balancing.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/column-count-with-rules.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/column-rules.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/float-avoidance.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/float-big-line.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/float-break.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/float-content-break.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/float-edge.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/float-paginate.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/nested-columns.html [ Failure ]
-crbug.com/850504 fast/multicol/vertical-lr/unsplittable-inline-block.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-update-transform.html [ Failure ]
 crbug.com/591099 fast/overflow/recompute-overflow-of-layout-root-container.html [ Failure ]
 crbug.com/591099 fast/parser/001.html [ Failure ]
@@ -488,7 +482,7 @@
 crbug.com/591099 fast/table/empty-table-percent-height.html [ Failure ]
 crbug.com/591099 fast/table/fixed-table-layout/table-with-percent-width.html [ Failure ]
 crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ]
-crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure ]
+crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure Pass ]
 crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ]
 crbug.com/591099 fast/table/percent-height-replaced-content-in-cell.html [ Failure ]
 crbug.com/591099 fast/table/table-display-types-vertical.html [ Failure ]
@@ -555,6 +549,7 @@
 crbug.com/591099 http/tests/navigation/form-targets-cross-site-frame-no-referrer.html [ Failure ]
 crbug.com/591099 http/tests/navigation/form-targets-cross-site-frame-post.html [ Failure ]
 crbug.com/591099 http/tests/navigation/form-with-enctype-targets-cross-site-frame.html [ Failure ]
+crbug.com/591099 http/tests/object/remote-frame-crash.html [ Pass ]
 crbug.com/591099 http/tests/origin_trials/sample-api-workers.html [ Pass ]
 crbug.com/591099 http/tests/permissions/test-api-surface.html [ Pass ]
 crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.https.html [ Crash Failure ]
@@ -712,159 +707,6 @@
 crbug.com/591099 paint/invalidation/svg/resize-svg-invalidate-children.html [ Failure ]
 crbug.com/591099 paint/invalidation/svg/scale-change-huge-geometry.html [ Failure ]
 crbug.com/728378 paint/invalidation/svg/scrolling-embedded-svg-file-image-repaint-problem.html [ Failure ]
-# rightsizing-grid.html is truly flaky, show flakiness on reload
-crbug.com/591099 external/wpt/content-security-policy/navigate-to/meta-refresh-redirected-blocked.sub.html [ Timeout ]
-crbug.com/591099 external/wpt/content-security-policy/reporting/report-original-url.sub.html [ Timeout ]
-crbug.com/591099 external/wpt/content-security-policy/style-src/style-src-stylesheet-nonce-allowed.html [ Timeout ]
-crbug.com/591099 external/wpt/content-security-policy/unsafe-hashes/style_attribute_denied_missing_unsafe_hashes.html [ Timeout ]
-crbug.com/591099 external/wpt/credential-management/require_securecontext.html [ Timeout ]
-crbug.com/591099 external/wpt/css/CSS2/normal-flow/replaced-intrinsic-001.xht [ Pass ]
-crbug.com/591099 external/wpt/css/css-animations/CSSAnimation-canceling.tentative.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-animations/animation-delay-010.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-backgrounds/background-332.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-backgrounds/parsing/border-radius-valid.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-cascade/important-prop.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-color/t422-rgba-onscreen-multiple-boxes-c.xht [ Pass ]
-crbug.com/591099 external/wpt/css/css-fill-stroke/paint-order-001.tentative.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-flexbox/anonymous-flex-item-005.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-flexbox/flex-minimum-height-flex-items-005.xht [ Pass ]
-crbug.com/591099 external/wpt/css/css-fonts/font-feature-settings-descriptor-01.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-fonts/font-variant-alternates-10.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-fonts/variations/at-font-face-font-matching.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-fonts/variations/font-style-parsing.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-layout-api/auto-block-size-inflow.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-layout-api/constraints-data-function-failure.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-layout-api/constraints-fixed-block-size-absolute-none.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-layout-api/constraints-fixed-block-size-grid-none.https.html [ Timeout ]
-crbug.com/591099 external/wpt/css/css-layout-api/constraints-fixed-inline-size-grid.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-layout-api/fragment-data-sab-failure.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-layout-api/perform-child-layout-available-inline-size-htb-vrl.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-layout-api/perform-child-layout-fixed-inline-size.https.html [ Timeout ]
-crbug.com/591099 external/wpt/css/css-masking/clip-path/clip-path-circle-005.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-masking/clip-path/clip-path-circle-006.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-masking/clip-path/clip-path-ellipse-005.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-paint-api/geometry-border-image-003.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-paint-api/geometry-with-float-size.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-paint-api/invalid-image-pending-script.https.html [ Timeout ]
-crbug.com/591099 external/wpt/css/css-paint-api/paint2d-gradient.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-paint-api/parse-input-arguments-006.https.html [ Timeout ]
-crbug.com/591099 external/wpt/css/css-paint-api/parse-input-arguments-013.https.html [ Timeout ]
-crbug.com/591099 external/wpt/css/css-paint-api/parse-input-arguments-018.https.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/css/css-pseudo/placeholder-input-number.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-011.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-012.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-shapes/shape-outside/shape-image/gradients/shape-outside-linear-gradient-014.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-024.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-syntax/charset/page-windows-1251-charset-attribute-bogus.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-tables/height-distribution/extra-height-given-to-all-row-groups-001.html [ Pass ]
-crbug.com/591099 external/wpt/css/css-transforms/transform-origin-name-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-transforms/transform-percent-004.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-transforms/transform-rotate-005.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-transforms/transform3d-rotatex-perspective-002.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-transitions/events-004.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-typed-om/the-stylepropertymap/properties/clip-path.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-palette.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-typed-om/the-stylepropertymap/properties/font-presentation.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-typed-om/the-stylepropertymap/properties/image-rendering.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-typed-om/the-stylepropertymap/properties/list-style-type.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-combine-upright.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-typed-om/the-stylepropertymap/properties/transition.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-values/lh-rlh-on-root-001.html [ Failure ]
-crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vlr-in-htb-020.xht [ Pass ]
-crbug.com/591099 external/wpt/css/css-writing-modes/sizing-orthog-vrl-in-htb-020.xht [ Pass ]
-crbug.com/591099 external/wpt/css/cssom-view/interfaces.html [ Failure ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/system-fixed.html [ Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-content-vert-001b.xhtml [ Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-break-request-vert-001a.html [ Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-flex-basis-content-002b.html [ Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-006.html [ Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/selectors4/dir-style-01a.html [ Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-052.html [ Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-026.html [ Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-021.html [ Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-024.html [ Pass ]
-crbug.com/591099 external/wpt/dom/nodes/Element-matches.html [ Failure ]
-crbug.com/591099 external/wpt/dom/traversal/TreeWalker-acceptNode-filter.html [ Timeout ]
-crbug.com/591099 external/wpt/editing/run/justifyleft.html [ Failure ]
-crbug.com/591099 external/wpt/entries-api/interfaces.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/fetch/api/abort/general.any.worker.html [ Failure ]
-crbug.com/591099 external/wpt/fetch/api/cors/cors-cookies-redirect.any.html [ Timeout ]
-crbug.com/591099 external/wpt/fetch/http-cache/basic-auth-cache-test.html [ Pass ]
-crbug.com/591099 external/wpt/fetch/http-cache/cc-request.html [ Failure ]
-crbug.com/591099 external/wpt/fetch/http-cache/partial.html [ Failure ]
-crbug.com/591099 external/wpt/fetch/range/general.window.html [ Failure ]
-crbug.com/591099 external/wpt/html-imports/fetching/already-in-import-map.html [ Timeout ]
-crbug.com/591099 external/wpt/html-media-capture/capture_reflect.html [ Failure ]
-crbug.com/591099 external/wpt/html-media-capture/idlharness.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/html/browsers/browsing-the-web/history-traversal/browsing_context_name_cross_origin.html [ Failure ]
-crbug.com/591099 external/wpt/html/browsers/history/the-location-interface/reload_document_open_write.html [ Failure ]
-crbug.com/591099 external/wpt/html/browsers/origin/origin-of-data-document.html [ Timeout ]
-crbug.com/591099 external/wpt/html/dom/elements/the-innertext-idl-attribute/getter.html [ Failure ]
-crbug.com/591099 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/attributes.sub.html?encoding=x-cp1251 [ Failure ]
-crbug.com/591099 external/wpt/html/semantics/embedded-content/the-iframe-element/iframe-load-event.html [ Failure ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/execution-timing/040.html [ Failure ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/module/instantiation-error-4.html [ Failure ]
-crbug.com/591099 external/wpt/html/semantics/scripting-1/the-script-element/module/referrer-origin-when-cross-origin.sub.html [ Failure ]
-crbug.com/591099 external/wpt/html/syntax/parsing/DOMContentLoaded-defer.html [ Failure ]
-crbug.com/591099 external/wpt/html/syntax/parsing/the-end.html [ Failure ]
-crbug.com/591099 external/wpt/html/webappapis/scripting/processing-model-2/runtime-error-cross-origin-setInterval.html [ Failure ]
-crbug.com/591099 external/wpt/infrastructure/reftest/reftest_match_fail.html [ Pass ]
-crbug.com/591099 external/wpt/infrastructure/reftest/reftest_timeout.html [ Pass ]
-crbug.com/591099 external/wpt/mediacapture-streams/MediaDevices-IDL-enumerateDevices.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/mixed-content/audio-tag/no-opt-in/same-host-http/top-level/no-redirect/optionally-blockable/no-opt-in-allows.https.html [ Failure ]
-crbug.com/591099 external/wpt/mixed-content/video-tag/no-opt-in/same-host-http/top-level/no-redirect/optionally-blockable/no-opt-in-allows.https.html [ Failure ]
-crbug.com/591099 external/wpt/navigation-timing/test_document_open.html [ Timeout ]
-crbug.com/591099 external/wpt/offscreen-canvas/compositing/2d.composite.image.source-atop.worker.html [ Timeout ]
-crbug.com/591099 external/wpt/offscreen-canvas/drawing-images-to-the-canvas/2d.drawImage.null.html [ Timeout ]
-crbug.com/591099 external/wpt/offscreen-canvas/fill-and-stroke-styles/2d.fillStyle.parse.rgba-clamp-2.worker.html [ Timeout ]
-crbug.com/591099 external/wpt/offscreen-canvas/line-styles/2d.line.width.basic.html [ Timeout ]
-crbug.com/591099 external/wpt/offscreen-canvas/path-objects/2d.path.arc.scale.1.worker.html [ Timeout ]
-crbug.com/591099 external/wpt/offscreen-canvas/path-objects/2d.path.transformation.changing.worker.html [ Timeout ]
-crbug.com/591099 external/wpt/offscreen-canvas/pixel-manipulation/2d.imageData.create2.nonfinite.html [ Failure ]
-crbug.com/591099 external/wpt/orientation-event/deviceorientationabsoluteevent.html [ Timeout ]
-crbug.com/591099 external/wpt/pointerevents/pointerevent_pointerout_received_once-manual.html [ Timeout ]
-crbug.com/591099 external/wpt/referrer-policy/no-referrer-when-downgrade/attr-referrer/cross-origin/http-https/img-tag/upgrade-protocol.keep-origin-redirect.http.html [ Timeout ]
-crbug.com/591099 external/wpt/referrer-policy/origin-when-cross-origin/attr-referrer/same-origin/http-https/script-tag/same-origin-downgrade.no-redirect.http.html [ Failure ]
-crbug.com/591099 external/wpt/referrer-policy/origin/attr-referrer/same-origin/http-https/script-tag/generic.no-redirect.http.html [ Failure ]
-crbug.com/591099 external/wpt/shape-detection/idlharness.any.html [ Failure ]
-crbug.com/591099 external/wpt/streams/readable-byte-streams/construct-byob-request.dedicatedworker.html [ Failure ]
-crbug.com/591099 external/wpt/streams/readable-byte-streams/properties.sharedworker.html [ Failure ]
-crbug.com/591099 external/wpt/url/interfaces.any.html [ Failure ]
-crbug.com/591099 external/wpt/web-animations/interfaces/Animation/pause.html [ Failure ]
-crbug.com/591099 external/wpt/web-animations/timing-model/animation-effects/current-iteration.html [ Failure ]
-crbug.com/591099 external/wpt/webaudio/the-audio-api/the-iirfilternode-interface/test-iirfilternode.html [ Timeout ]
-crbug.com/591099 external/wpt/webrtc/RTCConfiguration-iceServers.html [ Failure ]
-crbug.com/591099 external/wpt/webrtc/RTCConfiguration-rtcpMuxPolicy.html [ Failure ]
-crbug.com/591099 external/wpt/webrtc/RTCPeerConnection-setLocalDescription-offer.html [ Failure ]
-crbug.com/591099 external/wpt/webrtc/RTCPeerConnection-setLocalDescription-pranswer.html [ Failure ]
-crbug.com/591099 external/wpt/webrtc/RTCRtpParameters-transactionId.html [ Failure ]
-crbug.com/591099 external/wpt/webrtc/RTCRtpTransceiver-setCodecPreferences.html [ Failure ]
-crbug.com/591099 external/wpt/webstorage/storage_builtins.html [ Failure ]
-crbug.com/591099 external/wpt/webvtt/api/VTTCue/region.html [ Failure ]
-crbug.com/591099 external/wpt/webvtt/parsing/file-parsing/tests/settings-line.html [ Failure Timeout ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/align_middle_position_lt_50_size_gt_maximum_size.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/u0041_first.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/evil/9_cues_overlapping_completely_all_cues_have_same_timestamp.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/font_shorthand.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue/outline_shorthand.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/bold_object/bold_white-space_nowrap.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_animation_with_timestamp.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/class_object/class_transition_with_timestamp.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/id_color.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_text-decoration_line-through.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/italic_object/italic_white-space_pre-wrap_wrapped.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/voice_object/voice_white-space_pre-line_wrapped.html [ Pass ]
-crbug.com/591099 external/wpt/webvtt/rendering/cues-with-video/processing-model/selectors/cue_function/white-space_normal_wrapped.html [ Pass ]
-crbug.com/591099 external/wpt/workers/nested_worker.worker.html [ Failure ]
-crbug.com/591099 external/wpt/workers/nested_worker_importScripts.worker.html [ Failure ]
-crbug.com/591099 external/wpt/workers/postMessage_clone_port_error.htm [ Timeout ]
-crbug.com/591099 external/wpt/workers/semantics/interface-objects/001.worker.html [ Failure ]
-crbug.com/591099 external/wpt/workers/semantics/structured-clone/shared.html [ Failure ]
-crbug.com/591099 external/wpt/xhr/data-uri.htm [ Failure ]
-crbug.com/591099 external/wpt/xhr/responsexml-media-type.htm [ Failure ]
-crbug.com/591099 fast/events/background-tab-on-submit-ctrl-click.html [ Failure ]
-crbug.com/591099 fast/events/background-tab-on-submit-synthesized-ctrl-click.html [ Failure ]
-crbug.com/591099 http/tests/object/remote-frame-crash.html [ Pass ]
 crbug.com/591099 paint/invalidation/table/cached-change-cell-sl-border-color.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/collapsed-border-cell-resize.html [ Failure ]
 crbug.com/591099 paint/invalidation/table/composited-table-row.html [ Failure ]
@@ -900,19 +742,18 @@
 crbug.com/591099 printing/iframe-svg-in-object-print.html [ Failure ]
 crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ]
 crbug.com/591099 shapedetection/detection-HTMLVideoElement.html [ Pass ]
-crbug.com/591099 storage/indexeddb/cursor-continue-validity.html [ Timeout ]
+crbug.com/591099 storage/indexeddb/cursor-continue-validity.html [ Pass Timeout ]
 crbug.com/591099 storage/indexeddb/index-cursor.html [ Pass Timeout ]
 crbug.com/591099 storage/indexeddb/mozilla/indexes.html [ Timeout ]
 crbug.com/591099 storage/indexeddb/mozilla/test_objectStore_openKeyCursor.html [ Timeout ]
-crbug.com/591099 storage/indexeddb/objectstore-cursor.html [ Pass ]
-crbug.com/591099 storage/indexeddb/objectstore-keycursor.html [ Timeout ]
+crbug.com/591099 storage/indexeddb/objectstore-cursor.html [ Pass Timeout ]
+crbug.com/591099 storage/indexeddb/objectstore-keycursor.html [ Pass Timeout ]
 crbug.com/591099 svg/as-border-image/svg-as-border-image-2.html [ Failure ]
 crbug.com/591099 svg/as-border-image/svg-as-border-image.html [ Failure ]
 crbug.com/591099 svg/custom/object-sizing-no-width-height.xhtml [ Failure ]
 crbug.com/591099 svg/filters/feTurbulence-bad-seeds.html [ Failure ]
 crbug.com/591099 svg/in-html/sizing/svg-inline.html [ Failure ]
 crbug.com/591099 svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ Failure ]
-crbug.com/591099 svg/wicd/rightsizing-grid.html [ Pass Failure ]
 crbug.com/591099 svg/zoom/page/zoom-img-preserveAspectRatio-support-1.html [ Failure ]
 crbug.com/591099 svg/zoom/page/zoom-svg-through-object-with-absolute-size-2.xhtml [ Failure ]
 crbug.com/591099 svg/zoom/page/zoom-svg-through-object-with-absolute-size.xhtml [ Failure ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index ffb838d3..11aadf05 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1731,7 +1731,6 @@
 crbug.com/626703 virtual/outofblink-cors/external/wpt/fetch/api/request/request-cache-default-conditional.html [ Pass Timeout ]
 crbug.com/626703 virtual/outofblink-cors/external/wpt/fetch/api/response/response-cancel-stream.html [ Pass Timeout ]
 crbug.com/626703 virtual/outofblink-cors/external/wpt/fetch/http-cache/status.html [ Pass Timeout ]
-crbug.com/846497 virtual/outofblink-cors/external/wpt/fetch/security/redirect-to-url-with-credentials.https.html [ Pass Timeout ]
 crbug.com/626703 virtual/outofblink-cors/external/wpt/http/basic-auth-cache-test.html [ Timeout ]
 crbug.com/688486 virtual/outofblink-cors/external/wpt/service-workers/service-worker/fetch-request-resources.https.html [ Timeout Failure Pass ]
 crbug.com/736308 virtual/outofblink-cors/external/wpt/service-workers/service-worker/foreign-fetch-basics.https.html [ Timeout ]
@@ -2794,6 +2793,7 @@
 crbug.com/849859 external/wpt/web-animations/timing-model/animations/pausing-an-animation.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 external/wpt/web-animations/timing-model/timelines/update-and-send-events.html [ Timeout ]
 crbug.com/626703 external/wpt/console/console-timing-logging-manual.html [ Skip ]
 crbug.com/626703 external/wpt/css/css-scoping/host-specificity-002.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-scoping/slotted-specificity.html [ Failure ]
@@ -2847,7 +2847,8 @@
 crbug.com/626703 external/wpt/service-workers/service-worker/fetch-event-is-history-forward-navigation-manual.https.html [ Skip ]
 crbug.com/626703 external/wpt/service-workers/service-worker/fetch-event-is-history-backward-navigation-manual.https.html [ Skip ]
 crbug.com/626703 [ Mac10.12 ] virtual/picture-in-picture/external/wpt/feature-policy/feature-policy-frame-policy-allowed-for-all.https.sub.html [ Timeout ]
-crbug.com/626703 [ Mac10.12 ] external/wpt/fetch/security/redirect-to-url-with-credentials.https.html [ Timeout ]
+crbug.com/626703 external/wpt/fetch/security/redirect-to-url-with-credentials.https.html [ Timeout ]
+crbug.com/626703 virtual/outofblink-cors/external/wpt/fetch/security/redirect-to-url-with-credentials.https.html [ Timeout ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/domxpath/xml_xpath_runner.html [ Timeout ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-032.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-024.html [ Failure ]
@@ -4023,7 +4024,6 @@
 
 crbug.com/746128 [ Win7 Debug ] media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Failure ]
 crbug.com/746128 [ Win7 Debug ] virtual/new-remote-playback-pipeline/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Failure ]
-crbug.com/746128 [ Win7 Debug ] virtual/video-surface-layer/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Failure ]
 
 # Sheriff failures 2017-08-04
 crbug.com/626703 [ Win7 Release ] external/wpt/html/semantics/tabular-data/processing-model-1/span-limits.html [ Timeout ]
@@ -4416,6 +4416,21 @@
 crbug.com/811605 media/video-poster-after-loadedmetadata.html [ Failure Pass ]
 crbug.com/811605 virtual/video-surface-layer/media/video-poster-after-loadedmetadata.html [ Failure Pass ]
 
+crbug.com/860368 virtual/video-surface-layer/media/autoplay/webaudio-audio-context-resume.html  [ Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/controls/buttons-after-reset.html [ Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/controls/captions-menu-always-visible.html [ Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/controls/paint-controls-webkit-appearance-none-custom-bg.html [ Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/controls/paint-controls-webkit-appearance-none.html [ Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/track/track-cue-rendering-position-auto-rtl.html [ Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/video-frame-accurate-seek.html [ Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/video-zoom.html [ Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/controls/volumechange-muted-attribute.html [ Timeout Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/video-persistence.html [ Timeout Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/color-profile-video.html [ Timeout Pass Failure ]
+crbug.com/860368 virtual/video-surface-layer/media/controls/modern/singletouch-on-play-button.html [ Timeout Pass ]
+crbug.com/860368 virtual/video-surface-layer/media/controls/lazy-loaded-style.html [ Pass Failure ]
+
 # TODO(senorblanco): rebaseline after Skia roll
 crbug.com/802896 virtual/gpu/fast/canvas/canvas-ellipse-circumference-fill.html [ Failure Pass ]
 
@@ -4520,6 +4535,7 @@
 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 ]
+crbug.com/827209 virtual/user-activation-v2/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 ]
@@ -4670,8 +4686,8 @@
 
 # Sheriff 2018-06-11
 crbug.com/850202 [ Linux ] http/tests/devtools/network/network-filters.js [ Pass Failure ]
-crbug.com/851746 [ Linux ] fast/canvas/color-space/canvas-colorManaged-convertToBlob-roundtrip.html [ Pass Timeout ]
-crbug.com/851746 [ Linux ] virtual/gpu/fast/canvas/color-space/canvas-colorManaged-convertToBlob-roundtrip.html [ Pass Timeout ]
+crbug.com/851746 fast/canvas/color-space/canvas-colorManaged-convertToBlob-roundtrip.html [ Pass Timeout ]
+crbug.com/851746 virtual/gpu/fast/canvas/color-space/canvas-colorManaged-convertToBlob-roundtrip.html [ Pass Timeout ]
 
 crbug.com/853360 [ Mac ] fast/css/input-search-padding.html [ Failure ]
 crbug.com/853360 [ Mac ] fast/forms/calendar-picker/calendar-picker-appearance-ar.html [ Failure ]
@@ -4745,4 +4761,4 @@
 
 # Sheriff 2018-07-03
 crbug.com/860031 [ Linux ] http/tests/object/remote-frame-crash.html [ Failure ]
-crbug.com/859629 [ Mac10.13 ] http/tests/devtools/tracing/timeline-js/timeline-script-tag-1.js [ Failure ]
+crbug.com/859629 [ Mac10.13 ] http/tests/devtools/tracing/timeline-js/timeline-script-tag-1.js [ Failure ]
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index b2796c2..b76cbb2 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -73787,6 +73787,18 @@
      {}
     ]
    ],
+   "css/css-will-change/will-change-will-change-1.html": [
+    [
+     "/css/css-will-change/will-change-will-change-1.html",
+     [
+      [
+       "/css/reference/ref-filled-green-100px-square.xht",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht": [
     [
      "/css/css-writing-modes/abs-pos-non-replaced-icb-vlr-003.xht",
@@ -131988,6 +132000,11 @@
      {}
     ]
    ],
+   "css/css-will-change/META.yml": [
+    [
+     {}
+    ]
+   ],
    "css/css-writing-modes/META.yml": [
     [
      {}
@@ -143288,11 +143305,6 @@
      {}
     ]
    ],
-   "fetch/security/redirect-to-url-with-credentials.https-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "fetch/security/support/embedded-credential-window.sub.html": [
     [
      {}
@@ -182587,15 +182599,13 @@
      {}
     ]
    ],
-   "WebCryptoAPI/idlharness.https.html": [
+   "WebCryptoAPI/idlharness.https.any.js": [
     [
-     "/WebCryptoAPI/idlharness.https.html",
+     "/WebCryptoAPI/idlharness.https.any.html",
      {}
-    ]
-   ],
-   "WebCryptoAPI/idlharness.https.worker.js": [
+    ],
     [
-     "/WebCryptoAPI/idlharness.https.worker.html",
+     "/WebCryptoAPI/idlharness.https.any.worker.html",
      {}
     ]
    ],
@@ -251971,6 +251981,12 @@
      {}
     ]
    ],
+   "web-animations/timing-model/timelines/update-and-send-events.html": [
+    [
+     "/web-animations/timing-model/timelines/update-and-send-events.html",
+     {}
+    ]
+   ],
    "web-nfc/idlharness.https.html": [
     [
      "/web-nfc/idlharness.https.html",
@@ -265835,7 +265851,7 @@
    "support"
   ],
   "./README.md": [
-   "3e4c2ec3696939abd1849dee0809e40c1ecb12a7",
+   "5ba8bf6a121329db78fa5ea6844e9ac987aa5b94",
    "support"
   ],
   "./lint.whitelist": [
@@ -272318,18 +272334,14 @@
    "44475110f616c78bc04b93246f015e7a83e78fa7",
    "testharness"
   ],
-  "WebCryptoAPI/idlharness.https.html": [
-   "a0ac6f063c49d9c14b614dee18b681968eee05ad",
+  "WebCryptoAPI/idlharness.https.any.js": [
+   "c96f061be232a56e65b5c82bf1ce5fef664e183b",
    "testharness"
   ],
   "WebCryptoAPI/idlharness.https.worker-expected.txt": [
    "def2339796f4c477abc401f32315d528765383be",
    "support"
   ],
-  "WebCryptoAPI/idlharness.https.worker.js": [
-   "2ef22c6a9f185492c5bca7e52b3a7a6b363a2e2f",
-   "testharness"
-  ],
   "WebCryptoAPI/import_export/ec_importKey.https.worker.js": [
    "18e1f688107b6f2ec4d37f593567ec65ac95c9f9",
    "testharness"
@@ -274975,7 +274987,7 @@
    "manual"
   ],
   "console/console-countReset-logging-manual.html": [
-   "6edce76ce23ebc0b885f171020909617409016b9",
+   "bdce08f6994cfaa34505ab7fee89fb3593142355",
    "manual"
   ],
   "console/console-counting-label-conversion.any-expected.txt": [
@@ -312727,15 +312739,15 @@
    "reftest"
   ],
   "css/css-logical/logical-box-border-color-expected.txt": [
-   "b2cf7a8590ccbc6094d1abca8921a606fb038a74",
+   "cc1c43d6a46ae4800f85e9948393f63d42c2ec7c",
    "support"
   ],
   "css/css-logical/logical-box-border-color.html": [
-   "9e3a2a3796bf840f0e3ff78e54ad0382adff5b36",
+   "8b0476ee42276ea327938e573cd7a62ceff595c1",
    "testharness"
   ],
   "css/css-logical/logical-box-border-shorthands-expected.txt": [
-   "9237da31f53b5985f877f1daf89fd282423e4c85",
+   "3f501bfae4ee73e6e129f9b8676e73e43e122283",
    "support"
   ],
   "css/css-logical/logical-box-border-shorthands.html": [
@@ -312743,43 +312755,43 @@
    "testharness"
   ],
   "css/css-logical/logical-box-border-style-expected.txt": [
-   "e35d74b3e7b3b00061234c053e48816985894c7b",
+   "127a9b6a35d28c14ee6f0f9a9d24362650e2c23e",
    "support"
   ],
   "css/css-logical/logical-box-border-style.html": [
-   "b4e50119630c3b3b82f8ffbd03d7e221d77735f7",
+   "ad9ba7a5fd26a3d4f4465785dfbdc77177ab5d23",
    "testharness"
   ],
   "css/css-logical/logical-box-border-width-expected.txt": [
-   "40f072da034c27505e2fac7e732cca6b4003f369",
+   "9ec39fc2d0026572172c2c2b75066631f577cacc",
    "support"
   ],
   "css/css-logical/logical-box-border-width.html": [
-   "22e99144abdf927b195bec6aee59a41eb5b00700",
+   "eced0215f89082de7f674caf3be2c0bf704d9faf",
    "testharness"
   ],
   "css/css-logical/logical-box-inset-expected.txt": [
-   "21fd9c7acf36b2294e706b6646e8469faf3a778e",
+   "4fdc596c09bf03ac3e1d6f851941e498040def4f",
    "support"
   ],
   "css/css-logical/logical-box-inset.html": [
-   "a409ba1436ca88743278cd811bb7345560ccec23",
+   "b63ebeabb307cddca59a604084fb74809dbffe37",
    "testharness"
   ],
   "css/css-logical/logical-box-margin-expected.txt": [
-   "a27d6c12d6af0c8e9af48d40eb66befad98e4f39",
+   "dd7b8a5369059884658ad6342a425968f3114a78",
    "support"
   ],
   "css/css-logical/logical-box-margin.html": [
-   "b4812c03f505f096b97d752608defb604f683a67",
+   "ce777da59fbf772ac7b63928228491710ca32772",
    "testharness"
   ],
   "css/css-logical/logical-box-padding-expected.txt": [
-   "11d611c04d7f7c151c8bbf844fd9ecd463780250",
+   "443d7e7969c4dfb4686e85d27730cc5fe8693375",
    "support"
   ],
   "css/css-logical/logical-box-padding.html": [
-   "4f14cc4e6bd3623f6a55a6694039bd172e7a2361",
+   "0091cd5ff0f047dcd0fa46c4db871d13bbacabdf",
    "testharness"
   ],
   "css/css-logical/logical-box-size-expected.txt": [
@@ -312811,7 +312823,7 @@
    "testharness"
   ],
   "css/css-logical/resources/test-box-properties.js": [
-   "ce6a045e4afb9992c0ac13312f8b6516162d19a7",
+   "2a9ed0b45186a1910d71a4d449b6c21f672e8250",
    "support"
   ],
   "css/css-masking/META.yml": [
@@ -333954,6 +333966,14 @@
    "ac2c476205ffb2c2f985c44cb5e4acada01b0093",
    "reftest"
   ],
+  "css/css-will-change/META.yml": [
+   "1428cde5db0ae21bc9390d2e3649399d8e9abfae",
+   "support"
+  ],
+  "css/css-will-change/will-change-will-change-1.html": [
+   "1c0dc565ae3579de40b524c36a59378e55c5566d",
+   "reftest"
+  ],
   "css/css-writing-modes/META.yml": [
    "172c4d389801cb6d933965f76f2b4c4133cff185",
    "support"
@@ -342947,31 +342967,31 @@
    "testharness"
   ],
   "css/selectors/focus-visible-001-manual.html": [
-   "ac7c1ef4bd82931d3a36f8b8b22aeafbc7b0a227",
+   "313aff207b5293a35cbd720455ec2223feb06559",
    "manual"
   ],
   "css/selectors/focus-visible-002-manual.html": [
-   "7bd739f8e6bf47aa9ea264a8f898f60243279796",
+   "00c9ca73e61ba6e04f5a77ad9ca880fb91f1abda",
    "manual"
   ],
   "css/selectors/focus-visible-003-manual.html": [
-   "4c187f47eb337b89c8717a3a30707da83500dbb8",
+   "af3d9b470393cb03cf739e6e98be88f23cde34f8",
    "manual"
   ],
   "css/selectors/focus-visible-004-manual.html": [
-   "d657847b3df6f7da546f1034e49515f732aa971b",
+   "39cedf4919e7a553aa15fbcd48d79d0dc7d6a918",
    "manual"
   ],
   "css/selectors/focus-visible-005.html": [
-   "0970640f1d7e4c78378157ae305f8f24e57b94c2",
+   "1c3cf3ee0ff36a3dfec3425416b97dcd1024e5d5",
    "testharness"
   ],
   "css/selectors/focus-visible-006-manual.html": [
-   "e5be822a7a9dc5d9d22f6d4c90846308567ee4f6",
+   "dce2e1e9c56df4f568e65c331442760d1cd16153",
    "manual"
   ],
   "css/selectors/focus-visible-007.html": [
-   "5f787f1d0245e12d12e4507d909e5c38b8096a58",
+   "254e8c649b9b3801df191e6dc18bf01932a00191",
    "testharness"
   ],
   "css/selectors/focus-within-001-ref.html": [
@@ -347951,7 +347971,7 @@
    "testharness"
   ],
   "dom/interfaces_exclude=Node-expected.txt": [
-   "ce9c106d4190c5f90cde407a8fb2af45f7c9f119",
+   "ec7377e3763dbb8c5d4de1c0f6408a89f5d8225c",
    "support"
   ],
   "dom/lists/DOMTokenList-Iterable.html": [
@@ -349743,7 +349763,7 @@
    "testharness"
   ],
   "editing/run/delete-expected.txt": [
-   "2564f5956e2ba87099a328381af2d456054fcc20",
+   "075ce8c05f377af9e5ae031e268c59edadd43bdf",
    "support"
   ],
   "editing/run/delete-list-items-in-table-cell.html": [
@@ -354362,12 +354382,8 @@
    "678e1f80a090021a240933034d1a9206cddde8a4",
    "testharness"
   ],
-  "fetch/security/redirect-to-url-with-credentials.https-expected.txt": [
-   "e4ec943272637f603936e6a8e525f32fc888721e",
-   "support"
-  ],
   "fetch/security/redirect-to-url-with-credentials.https.html": [
-   "6eb9c75887afd084c12dee609dd4c4a7cf7a6a5e",
+   "a74c316c593a1abe293e13198c56927481382f15",
    "testharness"
   ],
   "fetch/security/support/embedded-credential-window.sub.html": [
@@ -375787,7 +375803,7 @@
    "support"
   ],
   "interfaces/WebCryptoAPI.idl": [
-   "1fa169a6badb1c21608f1e1a68075939e913603f",
+   "2275602ab1a7b6bdfebff1b886753bec32e1cbd4",
    "support"
   ],
   "interfaces/WebIDL.idl": [
@@ -375887,7 +375903,7 @@
    "support"
   ],
   "interfaces/dom.idl": [
-   "9621186ac979a5860d5c909b7505900a48c2c810",
+   "13caf62b3918fec8ad0cf436c6a855c0d457a56d",
    "support"
   ],
   "interfaces/encoding.idl": [
@@ -404247,7 +404263,7 @@
    "testharness"
   ],
   "web-animations/interfaces/Animation/onfinish.html": [
-   "db82fabeaf2b646647f134634fef30f05e5ec7f8",
+   "29b37a8ba9e653d2db88f628dd84bd99cb8be8db",
    "testharness"
   ],
   "web-animations/interfaces/Animation/pause-expected.txt": [
@@ -404439,19 +404455,19 @@
    "testharness"
   ],
   "web-animations/timing-model/animations/canceling-an-animation-expected.txt": [
-   "0e337cf9e0b684cd9f84ad97abfa1b0d15823ebe",
+   "a49a1835d0cf2b6a3baaedf2f07dc52b1061c15a",
    "support"
   ],
   "web-animations/timing-model/animations/canceling-an-animation.html": [
-   "c2750f33d773b01a9ed5ac4bb8c9f65f7e78265a",
+   "ea37c5d1dfdff51a085552c742e77730e2c697e7",
    "testharness"
   ],
   "web-animations/timing-model/animations/finishing-an-animation-expected.txt": [
-   "786f9de2b7bf2b175a33ed1e95f80bcee436a4ac",
+   "49dd0e6d49b649863c0323f561dae8b9271267ff",
    "support"
   ],
   "web-animations/timing-model/animations/finishing-an-animation.html": [
-   "afe654435332e798b3771b6ec6ca13bcca99e421",
+   "2800a906d3fbc0f8622a2543ea9c1020d39cd95f",
    "testharness"
   ],
   "web-animations/timing-model/animations/pausing-an-animation-expected.txt": [
@@ -404562,6 +404578,10 @@
    "29d7fe91c355fc22f563ca17315d2ab493dc0566",
    "testharness"
   ],
+  "web-animations/timing-model/timelines/update-and-send-events.html": [
+   "1f60aba2afa57960f17f19aa5ea1ff0370ec0b74",
+   "testharness"
+  ],
   "web-nfc/META.yml": [
    "99db7f9bd62c44a37a38f8ea3c438c3cd570827c",
    "support"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/README.md b/third_party/WebKit/LayoutTests/external/wpt/README.md
index c16793556..684f461 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/README.md
+++ b/third_party/WebKit/LayoutTests/external/wpt/README.md
@@ -133,11 +133,11 @@
 brew install nss
 ```
 
-On other platforms, download the firefox archive and common.tests.zip
+On other platforms, download the firefox archive and common.tests.tar.gz
 archive for your platform from
 [Mozilla CI](https://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/).
 
-Then extract `certutil[.exe]` from the tests.zip package and
+Then extract `certutil[.exe]` from the tests.tar.gz package and
 `libnss3[.so|.dll|.dynlib]` and put the former on your path and the latter on
 your library path.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.any.js b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.any.js
new file mode 100644
index 0000000..20aa40ed
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.any.js
@@ -0,0 +1,16 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+// https://w3c.github.io/webcrypto/Overview.html
+
+promise_test(async () => {
+  const idl = await fetch(`/interfaces/WebCryptoAPI.idl`).then(r => r.text());
+
+  const idl_array = new IdlArray();
+  idl_array.add_idls(idl);
+  idl_array.add_objects({
+    Crypto: ['crypto'],
+    SubtleCrypto: ['crypto.subtle']
+  });
+  idl_array.test();
+}, 'WebCryptoAPI interfaces');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.html b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.html
deleted file mode 100644
index c4fd0f3..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!doctype html>
-<html>
-<head>
-<meta charset=utf-8>
-<title>IDL check of WebCrypto</title>
-<link rel="help" href="https://w3c.github.io/webcrypto/Overview.html#crypto-interface">
-
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/resources/WebIDLParser.js></script>
-<script src=/resources/idlharness.js></script>
-</head>
-<body>
-
-<h1 class="instructions">Description</h1>
-
-<p class="instructions">This test verifies that the implementations of the WebCrypto API match with its WebIDL definition.</p>
-
-<div id='log'></div>
-
-<script>
-var file_input;
-setup(function() {
-    var idl_array = new IdlArray();
-
-    var request = new XMLHttpRequest();
-    request.open("GET", "../interfaces/WebCryptoAPI.idl");
-    request.send();
-    request.onload = function() {
-        var idls = request.responseText;
-
-        idl_array.add_idls(idls);
-
-        idl_array.add_objects({"Crypto":["crypto"], "SubtleCrypto":["crypto.subtle"]});
-
-        idl_array.test();
-        done();
-  };
-}, {explicit_done: true});
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.worker.js b/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.worker.js
deleted file mode 100644
index b4bbdda..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/WebCryptoAPI/idlharness.https.worker.js
+++ /dev/null
@@ -1,22 +0,0 @@
-importScripts("/resources/testharness.js");
-importScripts("/resources/WebIDLParser.js", "/resources/idlharness.js");
-
-var request = new XMLHttpRequest();
-request.open("GET", "../interfaces/WebCryptoAPI.idl");
-request.send();
-request.onload = function() {
-    var idl_array = new IdlArray();
-    var idls = request.responseText;
-
-    idl_array.add_untested_idls("[Global] interface Window { };");
-
-    idl_array.add_untested_idls("interface ArrayBuffer {};");
-    idl_array.add_untested_idls("interface ArrayBufferView {};");
-
-    idl_array.add_idls(idls);
-
-    idl_array.add_objects({"Crypto":["crypto"], "SubtleCrypto":["crypto.subtle"]});
-
-    idl_array.test();
-    done();
-};
diff --git a/third_party/WebKit/LayoutTests/external/wpt/console/console-countReset-logging-manual.html b/third_party/WebKit/LayoutTests/external/wpt/console/console-countReset-logging-manual.html
index 62122fb..7fe01f5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/console/console-countReset-logging-manual.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/console/console-countReset-logging-manual.html
@@ -4,7 +4,7 @@
 <title>Console Count Reset - Logging Manual Test</title>
 <meta name="author" title="Dominic Farolino" href="mailto:domfarolino@gmail.com">
 <meta name="assert" content="Console countReset method">
-<link rel="help" href="https://console.spec.whatwg.org/#countReset">
+<link rel="help" href="https://console.spec.whatwg.org/#countreset">
 </head>
 <body>
 <p>Open the console inside the developer tools. It should contain entries whose contents are:</p>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-will-change/META.yml b/third_party/WebKit/LayoutTests/external/wpt/css/css-will-change/META.yml
new file mode 100644
index 0000000..e937603
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-will-change/META.yml
@@ -0,0 +1,3 @@
+suggested_reviewers:
+  - dbaron
+  - tabatkins
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-will-change/will-change-will-change-1.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-will-change/will-change-will-change-1.html
new file mode 100644
index 0000000..812dc81
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-will-change/will-change-will-change-1.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<title>CSS Test: 'will-change: will-change' is invalid</title>
+<link rel="author" title="Cameron McCormack" href="mailto:cam@mcc.id.au">
+<link rel="help" href="https://drafts.csswg.org/css-will-change-1/#will-change">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht">
+<meta name="assert" content="'will-change: will-change' is invalid and thus will not induce a stacking context.">
+<style>
+div { position: absolute; }
+div div { top: 0; left: 0; width: 100px; height: 100px; }
+</style>
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div>
+  <div style="will-change: will-change;">
+    <div style="background-color: green; z-index: 2;"></div>
+  </div>
+  <div style="background-color: red; z-index: 1;"></div>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-001-manual.html b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-001-manual.html
index fefb433..3475ba6 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-001-manual.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-001-manual.html
@@ -8,21 +8,14 @@
   <script src="/resources/testharness.js"></script>
   <script src="/resources/testharnessreport.js"></script>
   <style>
-    :root {
-      --focus-background: hsl(50, 94%, 72%);
-      --focus-ring-color: rgb(59, 153, 252);
-    }
-
     :focus-visible {
-      outline: var(--focus-ring-color) auto 5px;
+      outline: darkgreen dotted 1px; /* fallback for Edge */
+      outline: darkgreen auto 5px;
     }
 
-    * {
+    :focus:not(:focus-visible) {
       outline: 0;
-    }
-
-    :focus {
-      background-color: var(--focus-background);
+      background-color: tomato;
     }
   </style>
 </head>
@@ -31,14 +24,14 @@
   <ol id="instructions">
     <li>If the user-agent does not claim to support the <code>:focus-visible</code> pseudo-class then SKIP this test.</li>
     <li>Use the TAB key on the keyboard to focus the element below that says "Focus me."</li>
-    <li>If the element does not have a blue outline, then the test result is FAILURE. If the element has a blue outline, then the test result is SUCCESS.</li>
+    <li>If the element has a red background, then the test result is FAILURE. If the element has a green outline, then the test result is SUCCESS.</li>
   </ol>
   <br>
   <div id="el" tabindex="0">Focus me.</div>
   <script>
     async_test(function(t) {
       el.addEventListener("focus", t.step_func(function() {
-        assert_equals(getComputedStyle(el).outlineColor, "rgb(59, 153, 252)");
+        assert_equals(getComputedStyle(el).outlineColor, "rgb(0, 100, 0)");
         t.done();
       }));
     }, "Keyboard focus should match :focus-visible");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-002-manual.html b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-002-manual.html
index 8b665b6..663b79b4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-002-manual.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-002-manual.html
@@ -8,21 +8,14 @@
   <script src="/resources/testharness.js"></script>
   <script src="/resources/testharnessreport.js"></script>
   <style>
-    :root {
-      --focus-background: hsl(50, 94%, 72%);
-      --focus-ring-color: rgb(59, 153, 252);
-    }
-
     :focus-visible {
-      outline: var(--focus-ring-color) auto 5px;
+      outline: darkgreen dotted 1px; /* fallback for Edge */
+      outline: darkgreen auto 5px;
     }
 
-    * {
+    :focus:not(:focus-visible) {
       outline: 0;
-    }
-
-    :focus {
-      background-color: var(--focus-background);
+      background-color: tomato;
     }
   </style>
 </head>
@@ -31,7 +24,7 @@
   <ol id="instructions">
     <li>If the user-agent does not claim to support the <code>:focus-visible</code> pseudo-class then SKIP this test.</li>
     <li><strong>Click</strong> each form element below to focus it.</li>
-    <li>If the element does not have a blue outline, then the test result is FAILURE. If the element has a blue outline, then the test result is SUCCESS.</li>
+    <li>If the element has a red background, then the test result is FAILURE. If the element has a green outline, then the test result is SUCCESS.</li>
   </ol>
   <br>
   <div>
@@ -86,7 +79,7 @@
     async_test(function(t) {
         function testNextTarget(e) {
             let el = e.target;
-            assert_equals(getComputedStyle(el).outlineColor, "rgb(59, 153, 252)");
+            assert_equals(getComputedStyle(el).outlineColor, "rgb(0, 100, 0)");
             el.dataset.tested = true;
             let nextTarget = document.querySelector("[data-tested=false]");
             if (nextTarget) {
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-003-manual.html b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-003-manual.html
index 47b41016..eeb2904 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-003-manual.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-003-manual.html
@@ -8,21 +8,14 @@
   <script src="/resources/testharness.js"></script>
   <script src="/resources/testharnessreport.js"></script>
   <style>
-    :root {
-      --focus-background: hsl(50, 94%, 72%);
-      --focus-ring-color: rgb(59, 153, 252);
-    }
-
     :focus-visible {
-      outline: var(--focus-ring-color) auto 5px;
+      outline: red dotted 1px; /* fallback for Edge */
+      outline: red auto 5px;
     }
 
-    * {
-      outline: 0;
-    }
-
-    :focus {
-      background-color: var(--focus-background);
+    :focus:not(:focus-visible) {
+        outline: 0;
+        background-color: darkseagreen;
     }
   </style>
 </head>
@@ -31,7 +24,7 @@
   <ol id="instructions">
     <li>If the user-agent does not claim to support the <code>:focus-visible</code> pseudo-class then SKIP this test.</li>
     <li>Click each element element below to focus it.</li>
-    <li>If the element has a blue outline, then the test result is FAILURE. If the element does NOT have a blue outline, then the test result is SUCCESS.</li>
+    <li>If the element has a red outline, then the test result is FAILURE. If the element has a green background, then the test result is SUCCESS.</li>
   </ol>
   <br />
   <div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-004-manual.html b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-004-manual.html
index 2a95f72..dba057c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-004-manual.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-004-manual.html
@@ -8,21 +8,14 @@
   <script src="/resources/testharness.js"></script>
   <script src="/resources/testharnessreport.js"></script>
   <style>
-    :root {
-      --focus-background: hsl(50, 94%, 72%);
-      --focus-ring-color: rgb(59, 153, 252);
-    }
-
     :focus-visible {
-      outline: var(--focus-ring-color) auto 5px;
+      outline: red dotted 1px; /* fallback for Edge */
+      outline: red auto 5px;
     }
 
-    * {
+    :focus:not(:focus-visible) {
       outline: 0;
-    }
-
-    :focus {
-      background-color: var(--focus-background);
+      background-color: darkseagreen;
     }
   </style>
 </head>
@@ -31,7 +24,7 @@
   <ol id="instructions">
     <li>If the user-agent does not claim to support the <code>:focus-visible</code> pseudo-class then SKIP this test.</li>
     <li>Click each element element below to focus it.</li>
-    <li>If the element has a blue outline, then the test result is FAILURE. If the element does NOT have a blue outline, then the test result is SUCCESS.</li>
+    <li>If the element has a red outline, then the test result is FAILURE. If the element has a green background, then the test result is SUCCESS.</li>
   </ol>
   <br />
   <div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-005.html b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-005.html
index 4485799..706bd1e 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-005.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-005.html
@@ -8,30 +8,23 @@
   <script src="/resources/testharness.js"></script>
   <script src="/resources/testharnessreport.js"></script>
   <style>
-    :root {
-      --focus-background: hsl(50, 94%, 72%);
-      --focus-ring-color: rgb(59, 153, 252);
-    }
-
     :focus-visible {
-      outline: var(--focus-ring-color) auto 5px;
+      outline: darkgreen dotted 1px; /* fallback for Edge */
+      outline: darkgreen auto 5px;
     }
 
-    * {
+    :focus:not(:focus-visible) {
       outline: 0;
-    }
-
-    :focus {
-      background-color: var(--focus-background);
+      background-color: tomato;
     }
   </style>
 </head>
 <body>
-  This test checks that programmatically focusing an element causes <code>:focus-visible</code> matching to trigger.
+  This test checks that programmatically focusing an element after a click does not cause <code>:focus-visible</code> matching to trigger.
   <ol id="instructions">
     <li>If the user-agent does not claim to support the <code>:focus-visible</code> pseudo-class then SKIP this test.</li>
     <li>Click the button below that says "Click me."</li>
-    <li>If the element that says "I will be focused programmatically." does not have a blue outline, then the test result is FAILURE. If the element has a blue outline, then the test result is SUCCESS.</li>
+    <li>If the element that says "I will be focused programmatically." has a red outline, then the test result is FAILURE. If the element has a green background, then the test result is SUCCESS.</li>
   </ol>
   <br />
   <button id="button">Click me.</button>
@@ -42,7 +35,7 @@
     });
     async_test(function(t) {
       el.addEventListener("focus", t.step_func(() => {
-        assert_equals(getComputedStyle(el).outlineColor, "rgb(59, 153, 252)");
+        assert_equals(getComputedStyle(el).outlineColor, "rgb(0, 100, 0)");
         t.done();
       }));
       el.focus();
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-006-manual.html b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-006-manual.html
index e61a885..974abc0 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-006-manual.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-006-manual.html
@@ -14,21 +14,14 @@
         padding: 2px 5px;
     }
 
-    :root {
-      --focus-background: hsl(50, 94%, 72%);
-      --focus-ring-color: rgb(59, 153, 252);
-    }
-
     :focus-visible {
-      outline: var(--focus-ring-color) auto 5px;
+      outline: darkgreen dotted 1px; /* fallback for Edge */
+      outline: darkgreen auto 5px;
     }
 
-    * {
+    :focus:not(:focus-visible) {
       outline: 0;
-    }
-
-    :focus {
-      background-color: var(--focus-background);
+      background-color: tomato;
     }
   </style>
 </head>
@@ -37,7 +30,7 @@
   <ol id="instructions">
     <li>If the user-agent does not claim to support the <code>:focus-visible</code> pseudo-class then SKIP this test.</li>
     <li><strong>Click</strong> the content editable span below to focus it.</li>
-    <li>If the element does not have a blue outline, then the test result is FAILURE. If the element has a blue outline, then the test result is SUCCESS.</li>
+    <li>If the element has a red background, then the test result is FAILURE. If the element has a blue outline, then the test result is SUCCESS.</li>
   </ol>
   <br />
   <div>
@@ -46,7 +39,7 @@
   <script>
     async_test(function(t) {
       el.addEventListener("focus", t.step_func(function() {
-        assert_equals(getComputedStyle(el).outlineColor, "rgb(59, 153, 252)");
+        assert_equals(getComputedStyle(el).outlineColor, "rgb(0, 100, 0)");
         t.done();
       }));
     }, "Focus should always match :focus-visible on content editable divs");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-007.html b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-007.html
index 05c89ca..2dcb3e34 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-007.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/selectors/focus-visible-007.html
@@ -10,22 +10,26 @@
   <script src="/resources/testdriver.js"></script>
   <script src="/resources/testdriver-vendor.js"></script>
   <style>
-    :root {
-      --focus-background: hsl(50, 94%, 72%);
-      --focus-ring-color: rgb(59, 153, 252);
+    [data-hadkeydown] :focus-visible {
+      outline: darkgreen dotted 1px; /* fallback for Edge */
+      outline: darkgreen auto 5px;
     }
 
-    :focus-visible {
-      outline: var(--focus-ring-color) auto 5px;
+    [data-hadmousedown] :focus-visible {
+      outline: red dotted 1px; /* fallback for Edge */
+      outline: red auto 5px;
     }
 
-    * {
-      outline-width: 0;
+    [data-hadkeydown] :focus:not(:focus-visible) {
+      outline: 0;
+      background-color: tomato;
     }
 
-    :focus {
-      background-color: var(--focus-background);
+    [data-hadmousedown] :focus:not(:focus-visible) {
+      outline: 0;
+      background-color: darkseagreen;
     }
+
   </style>
 </head>
 <body>
@@ -33,13 +37,11 @@
   <ol id="instructions">
     <li>If the user-agent does not claim to support the <code>:focus-visible</code> pseudo-class then SKIP this test.</li>
     <li>Use the mouse to focus the element below that says "Click me first."</li>
-    <li>If the element has a blue outline, then the test result is FAILURE.</li>
+    <li>If the element has a red outline, then the test result is FAILURE.</li>
     <li>Press the SHIFT key.</li>
-    <li>If the element now DOES NOT have a blue outline, then the test result is FAILURE..</li>
-    <li>Use the mouse to click the element that says "Click me first." a second time</li>
-    <li>If the element now DOES NOT still have a blue outline, then the test result is FAILURE.</li>
+    <li>If the element now has a red background, then the test result is FAILURE.</li>
     <li>Use the mouse to click the element below that says "Click me second."</li>
-        <li>If the element does not have a blue outline then the test result is SUCCESS.</li>
+    <li>If the element has a green background, the test result is SUCCESS.</li>
   </ol>
 
   <div id="one" tabindex="0">Click me first.</div>
@@ -51,16 +53,10 @@
     }, true);
 
     document.body.addEventListener("mousedown", (e) => {
+      delete document.body.dataset.hadkeydown;
       document.body.dataset.hadmousedown = "";
     }, true);
 
-    document.body.addEventListener("focus", (e) => {
-      if ("hadmousedown" in document.body.dataset) {
-        delete document.body.dataset.hadmousedown;
-        delete document.body.dataset.hadkeydown;
-      }
-    }, true);
-
     async_test(async function(t) {
       let tested_modality_change = false;
       let tested_modality_unchanged_by_mouse_click = false;
@@ -104,7 +100,7 @@
         test_driver.click(one);
       })).catch(t.step_func((e) => {
         // TODO(crbug.com/828858): Remove this check once bug is resolved.
-        assert_true(false, "send_keys not implmented yet");
+        assert_true(false, "send_keys not implemented yet");
         t.done();
       }));
     }, "Using keyboard while element is focused should trigger :focus-visible; using mouse without moving focus should not cancel it; moving focus using mouse should cancel it.");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces_exclude=Node-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces_exclude=Node-expected.txt
index be7a3a0f..94a3ae5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces_exclude=Node-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/interfaces_exclude=Node-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 1335 tests; 1314 PASS, 21 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1339 tests; 1318 PASS, 21 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Test driver
 PASS Partial interface Window: original interface defined
 PASS Event interface: existence and properties of interface object
@@ -642,6 +642,8 @@
 PASS Unscopable handled correctly for removeAttribute(DOMString) on Element
 PASS Element interface: operation removeAttributeNS(DOMString, DOMString)
 PASS Unscopable handled correctly for removeAttributeNS(DOMString, DOMString) on Element
+PASS Element interface: operation toggleAttribute(DOMString, boolean)
+PASS Unscopable handled correctly for toggleAttribute(DOMString, boolean) on Element
 PASS Element interface: operation hasAttribute(DOMString)
 PASS Unscopable handled correctly for hasAttribute(DOMString) on Element
 PASS Element interface: operation hasAttributeNS(DOMString, DOMString)
@@ -731,6 +733,8 @@
 PASS Element interface: calling removeAttribute(DOMString) on element with too few arguments must throw TypeError
 PASS Element interface: element must inherit property "removeAttributeNS(DOMString, DOMString)" with the proper type
 PASS Element interface: calling removeAttributeNS(DOMString, DOMString) on element with too few arguments must throw TypeError
+PASS Element interface: element must inherit property "toggleAttribute(DOMString, boolean)" with the proper type
+PASS Element interface: calling toggleAttribute(DOMString, boolean) on element with too few arguments must throw TypeError
 PASS Element interface: element must inherit property "hasAttribute(DOMString)" with the proper type
 PASS Element interface: calling hasAttribute(DOMString) on element with too few arguments must throw TypeError
 PASS Element interface: element must inherit property "hasAttributeNS(DOMString, DOMString)" with the proper type
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/security/redirect-to-url-with-credentials.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/fetch/security/redirect-to-url-with-credentials.https-expected.txt
deleted file mode 100644
index 3871390..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/security/redirect-to-url-with-credentials.https-expected.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-This is a testharness.js-based test.
-FAIL No CORS fetch after a redirect with an URL containing credentials promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch"
-PASS CORS fetch after a redirect with a cross origin URL containing credentials
-FAIL CORS fetch after a redirect with a same origin URL containing credentials promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch"
-FAIL Image loading after a redirect with an URL containing credentials promise_test: Unhandled rejection with value: object "[object Event]"
-PASS CORS Image loading after a redirect with a cross origin URL containing credentials
-FAIL CORS Image loading after a redirect with a same origin URL containing credentials promise_test: Unhandled rejection with value: object "[object Event]"
-FAIL Frame loading after a redirect with an URL containing credentials promise_test: Unhandled rejection with value: "Frame loading timed out"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/fetch/security/redirect-to-url-with-credentials.https.html b/third_party/WebKit/LayoutTests/external/wpt/fetch/security/redirect-to-url-with-credentials.https.html
index c5c32d3..4bf9748 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/fetch/security/redirect-to-url-with-credentials.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/fetch/security/redirect-to-url-with-credentials.https.html
@@ -60,7 +60,6 @@
         iframe.src = frameURL;
         iframe.onload = resolve;
         iframe.onerror = (e) => reject(e);
-        test.step_timeout(() => reject("Frame loading timed out"), 5000);
     });
     document.body.removeChild(iframe);
 }, "Frame loading after a redirect with an URL containing credentials");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/WebCryptoAPI.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/WebCryptoAPI.idl
index f48eaf1..73266ac 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/WebCryptoAPI.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/WebCryptoAPI.idl
@@ -1,17 +1,19 @@
-[NoInterfaceObject]
-interface GlobalCrypto {
+// GENERATED CONTENT - DO NOT EDIT
+// Content of this file was automatically extracted from the
+// "Web Cryptography API" spec.
+// See: https://w3c.github.io/webcrypto/Overview.html
+
+partial interface mixin WindowOrWorkerGlobalScope {
   readonly attribute Crypto crypto;
 };
 
-//Window implements GlobalCrypto;
-//WorkerGlobalScope implements GlobalCrypto;
-
 [Exposed=(Window,Worker)]
 interface Crypto {
-  readonly attribute SubtleCrypto subtle;
+  [SecureContext] readonly attribute SubtleCrypto subtle;
   ArrayBufferView getRandomValues(ArrayBufferView array);
 };
 
+
 typedef (object or DOMString) AlgorithmIdentifier;
 
 typedef AlgorithmIdentifier HashAlgorithmIdentifier;
@@ -20,15 +22,17 @@
   required DOMString name;
 };
 
+
 dictionary KeyAlgorithm {
   required DOMString name;
 };
 
+
 enum KeyType { "public", "private", "secret" };
 
 enum KeyUsage { "encrypt", "decrypt", "sign", "verify", "deriveKey", "deriveBits", "wrapKey", "unwrapKey" };
 
-[Exposed=(Window,Worker)]
+[SecureContext,Exposed=(Window,Worker)]
 interface CryptoKey {
   readonly attribute KeyType type;
   readonly attribute boolean extractable;
@@ -39,7 +43,7 @@
 
 enum KeyFormat { "raw", "spki", "pkcs8", "jwk" };
 
-[Exposed=(Window,Worker)]
+[SecureContext,Exposed=(Window,Worker)]
 interface SubtleCrypto {
   Promise<any> encrypt(AlgorithmIdentifier algorithm,
                        CryptoKey key,
@@ -65,11 +69,11 @@
                          AlgorithmIdentifier derivedKeyType,
                          boolean extractable,
                          sequence<KeyUsage> keyUsages );
-  Promise<any> deriveBits(AlgorithmIdentifier algorithm,
+  Promise<ArrayBuffer> deriveBits(AlgorithmIdentifier algorithm,
                           CryptoKey baseKey,
                           unsigned long length);
 
-  Promise<any> importKey(KeyFormat format,
+  Promise<CryptoKey> importKey(KeyFormat format,
                          (BufferSource or JsonWebKey) keyData,
                          AlgorithmIdentifier algorithm,
                          boolean extractable,
@@ -80,7 +84,7 @@
                        CryptoKey key,
                        CryptoKey wrappingKey,
                        AlgorithmIdentifier wrapAlgorithm);
-  Promise<any> unwrapKey(KeyFormat format,
+  Promise<CryptoKey> unwrapKey(KeyFormat format,
                          BufferSource wrappedKey,
                          CryptoKey unwrappingKey,
                          AlgorithmIdentifier unwrapAlgorithm,
@@ -89,8 +93,9 @@
                          sequence<KeyUsage> keyUsages );
 };
 
+
 dictionary RsaOtherPrimesInfo {
- // The following fields are defined in Section 6.3.2.7 of JSON Web Algorithms
+  // The following fields are defined in Section 6.3.2.7 of JSON Web Algorithms
   DOMString r;
   DOMString d;
   DOMString t;
@@ -122,13 +127,16 @@
   DOMString k;
 };
 
+
 typedef Uint8Array BigInteger;
 
+
 dictionary CryptoKeyPair {
   CryptoKey publicKey;
   CryptoKey privateKey;
 };
 
+
 dictionary RsaKeyGenParams : Algorithm {
   // The length, in bits, of the RSA modulus
   required [EnforceRange] unsigned long modulusLength;
@@ -136,11 +144,13 @@
   required BigInteger publicExponent;
 };
 
+
 dictionary RsaHashedKeyGenParams : RsaKeyGenParams {
   // The hash algorithm to use
   required HashAlgorithmIdentifier hash;
 };
 
+
 dictionary RsaKeyAlgorithm : KeyAlgorithm {
   // The length, in bits, of the RSA modulus
   required unsigned long modulusLength;
@@ -148,130 +158,150 @@
   required BigInteger publicExponent;
 };
 
+
 dictionary RsaHashedKeyAlgorithm : RsaKeyAlgorithm {
   // The hash algorithm that is used with this key
   required KeyAlgorithm hash;
 };
 
-dictionary RsaHashedImportParams {
+
+dictionary RsaHashedImportParams : Algorithm {
   // The hash algorithm to use
   required HashAlgorithmIdentifier hash;
 };
 
+
 dictionary RsaPssParams : Algorithm {
-// The desired length of the random salt
-[EnforceRange] required unsigned long saltLength;
+  // The desired length of the random salt
+  [EnforceRange] required unsigned long saltLength;
 };
 
+
 dictionary RsaOaepParams : Algorithm {
-// The optional label/application data to associate with the message
-BufferSource label;
+  // The optional label/application data to associate with the message
+  BufferSource label;
 };
 
+
 dictionary EcdsaParams : Algorithm {
-// The hash algorithm to use
-required HashAlgorithmIdentifier hash;
+  // The hash algorithm to use
+  required HashAlgorithmIdentifier hash;
 };
 
+
 typedef DOMString NamedCurve;
 
 dictionary EcKeyGenParams : Algorithm {
-// A named curve
-required NamedCurve namedCurve;
+  // A named curve
+  required NamedCurve namedCurve;
 };
 
+
 dictionary EcKeyAlgorithm : KeyAlgorithm {
-// The named curve that the key uses
-required NamedCurve namedCurve;
+  // The named curve that the key uses
+  required NamedCurve namedCurve;
 };
 
+
 dictionary EcKeyImportParams : Algorithm {
-// A named curve
-required NamedCurve namedCurve;
+  // A named curve
+  required NamedCurve namedCurve;
 };
 
+
 dictionary EcdhKeyDeriveParams : Algorithm {
-// The peer's EC public key.
-required CryptoKey public;
+  // The peer's EC public key.
+  required CryptoKey public;
 };
 
+
 dictionary AesCtrParams : Algorithm {
-// The initial value of the counter block. counter MUST be 16 bytes
-// (the AES block size). The counter bits are the rightmost length
-// bits of the counter block. The rest of the counter block is for
-// the nonce. The counter bits are incremented using the standard
-// incrementing function specified in NIST SP 800-38A Appendix B.1:
-// the counter bits are interpreted as a big-endian integer and
-// incremented by one.
-required BufferSource counter;
-// The length, in bits, of the rightmost part of the counter block
-// that is incremented.
-[EnforceRange] required octet length;
+  // The initial value of the counter block. counter MUST be 16 bytes
+  // (the AES block size). The counter bits are the rightmost length
+  // bits of the counter block. The rest of the counter block is for
+  // the nonce. The counter bits are incremented using the standard
+  // incrementing function specified in NIST SP 800-38A Appendix B.1:
+  // the counter bits are interpreted as a big-endian integer and
+  // incremented by one.
+  required BufferSource counter;
+  // The length, in bits, of the rightmost part of the counter block
+  // that is incremented.
+  [EnforceRange] required octet length;
 };
 
+
 dictionary AesKeyAlgorithm : KeyAlgorithm {
-// The length, in bits, of the key.
-required unsigned short length;
+  // The length, in bits, of the key.
+  required unsigned short length;
 };
 
+
 dictionary AesKeyGenParams : Algorithm {
-// The length, in bits, of the key.
-[EnforceRange] required unsigned short length;
+  // The length, in bits, of the key.
+  [EnforceRange] required unsigned short length;
 };
 
+
 dictionary AesDerivedKeyParams : Algorithm {
-// The length, in bits, of the key.
-[EnforceRange] required unsigned short length;
+  // The length, in bits, of the key.
+  [EnforceRange] required unsigned short length;
 };
 
+
 dictionary AesCbcParams : Algorithm {
-// The initialization vector. MUST be 16 bytes.
-required BufferSource iv;
+  // The initialization vector. MUST be 16 bytes.
+  required BufferSource iv;
 };
 
+
 dictionary AesGcmParams : Algorithm {
-// The initialization vector to use. May be up to 2^64-1 bytes long.
-required BufferSource iv;
-// The additional authentication data to include.
-BufferSource additionalData;
-// The desired length of the authentication tag. May be 0 - 128.
-[EnforceRange] octet tagLength;
+  // The initialization vector to use. May be up to 2^64-1 bytes long.
+  required BufferSource iv;
+  // The additional authentication data to include.
+  BufferSource additionalData;
+  // The desired length of the authentication tag. May be 0 - 128.
+  [EnforceRange] octet tagLength;
 };
 
+
 dictionary HmacImportParams : Algorithm {
-// The inner hash function to use.
-HashAlgorithmIdentifier hash;
-// The length (in bits) of the key.
-[EnforceRange] unsigned long length;
+  // The inner hash function to use.
+  required HashAlgorithmIdentifier hash;
+  // The length (in bits) of the key.
+  [EnforceRange] unsigned long length;
 };
 
+
 dictionary HmacKeyAlgorithm : KeyAlgorithm {
-// The inner hash function to use.
-required KeyAlgorithm hash;
-// The length (in bits) of the key.
-required unsigned long length;
+  // The inner hash function to use.
+  required KeyAlgorithm hash;
+  // The length (in bits) of the key.
+  required unsigned long length;
 };
 
+
 dictionary HmacKeyGenParams : Algorithm {
-// The inner hash function to use.
-required HashAlgorithmIdentifier hash;
-// The length (in bits) of the key to generate. If unspecified, the
-// recommended length will be used, which is the size of the associated hash function's block
-// size.
-[EnforceRange] unsigned long length;
+  // The inner hash function to use.
+  required HashAlgorithmIdentifier hash;
+  // The length (in bits) of the key to generate. If unspecified, the
+  // recommended length will be used, which is the size of the associated hash function's block
+  // size.
+  [EnforceRange] unsigned long length;
 };
 
-dictionary HkdfCtrParams : Algorithm {
-// The algorithm to use with HMAC (e.g.: SHA-256)
-required HashAlgorithmIdentifier hash;
-// A bit string that corresponds to the label that identifies the purpose for the derived keying material.
-required BufferSource label;
-// A bit string that corresponds to the context of the key derivation, as described in Section 5 of [NIST SP800-108]
-required BufferSource context;
+
+dictionary HkdfParams : Algorithm {
+  // The algorithm to use with HMAC (e.g.: SHA-256)
+  required HashAlgorithmIdentifier hash;
+  // A bit string that corresponds to the salt used in the extract step.
+  required BufferSource salt;
+  // A bit string that corresponds to the context and application specific context for the derived keying material.
+  required BufferSource info;
 };
 
+
 dictionary Pbkdf2Params : Algorithm {
-required BufferSource salt;
-[EnforceRange] required unsigned long iterations;
-required HashAlgorithmIdentifier hash;
+  required BufferSource salt;
+  [EnforceRange] required unsigned long iterations;
+  required HashAlgorithmIdentifier hash;
 };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl
index 3779e3d..1d3216f9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/dom.idl
@@ -360,6 +360,7 @@
   void setAttributeNS(DOMString? namespace, DOMString qualifiedName, DOMString value);
   void removeAttribute(DOMString qualifiedName);
   void removeAttributeNS(DOMString? namespace, DOMString localName);
+  boolean toggleAttribute(DOMString qualifiedName, optional boolean force);
   boolean hasAttribute(DOMString qualifiedName);
   boolean hasAttributeNS(DOMString? namespace, DOMString localName);
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/onfinish.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/onfinish.html
index 79d1d70..2df3cfb 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/onfinish.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/interfaces/Animation/onfinish.html
@@ -71,7 +71,7 @@
   animation.finish();
 }, 'onfinish event is fired when animation.finish() is called');
 
-promise_test(t => {
+promise_test(async t => {
   const div = createDiv(t);
   const animation = div.animate({}, 100 * MS_PER_SEC);
 
@@ -82,38 +82,36 @@
   animation.currentTime = 100 * MS_PER_SEC / 2;
   animation.pause();
 
-  return animation.ready.then(() => {
-    animation.currentTime = 100 * MS_PER_SEC;
-    return waitForAnimationFrames(2);
-  });
+  await animation.ready;
+  animation.currentTime = 100 * MS_PER_SEC;
+  await waitForAnimationFrames(2);
 }, 'onfinish event is not fired when paused');
 
-promise_test(t => {
+promise_test(async t => {
   const div = createDiv(t);
   const animation = div.animate({}, 100 * MS_PER_SEC);
   animation.onfinish = event => {
     assert_unreached('onfinish event should not be fired');
   };
 
-  return animation.ready.then(() => {
-    animation.playbackRate = 0;
-    animation.currentTime = 100 * MS_PER_SEC;
-    return waitForAnimationFrames(2);
-  });
+  await animation.ready;
+  animation.playbackRate = 0;
+  animation.currentTime = 100 * MS_PER_SEC;
+  await waitForAnimationFrames(2);
 }, 'onfinish event is not fired when the playbackRate is zero');
 
-promise_test(t => {
+promise_test(async t => {
   const div = createDiv(t);
   const animation = div.animate({}, 100 * MS_PER_SEC);
+
   animation.onfinish = event => {
     assert_unreached('onfinish event should not be fired');
   };
 
-  return animation.ready.then(() => {
-    animation.currentTime = 100 * MS_PER_SEC;
-    animation.currentTime = 100 * MS_PER_SEC / 2;
-    return waitForAnimationFrames(2);
-  });
+  await animation.ready;
+  animation.currentTime = 100 * MS_PER_SEC;
+  animation.currentTime = 100 * MS_PER_SEC / 2;
+  await waitForAnimationFrames(2);
 }, 'onfinish event is not fired when the animation falls out ' +
    'finished state immediately');
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/canceling-an-animation-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/canceling-an-animation-expected.txt
index 3c864569..f58af17 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/canceling-an-animation-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/canceling-an-animation-expected.txt
@@ -7,5 +7,6 @@
 PASS The ready promise should be replaced when the animation is canceled
 PASS The finished promise should NOT be rejected if the animation is already idle
 PASS The cancel event should NOT be fired if the animation is already idle
+PASS Canceling an animation should fire cancel event on orphaned element
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/canceling-an-animation.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/canceling-an-animation.html
index 539e922f..b0ef0b1 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/canceling-an-animation.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/canceling-an-animation.html
@@ -106,5 +106,21 @@
 }, 'The cancel event should NOT be fired if the animation is already'
    + ' idle');
 
+promise_test(async t => {
+  const div = createDiv(t);
+  const animation = div.animate({}, 100 * MS_PER_SEC);
+  div.remove();
+
+  const eventWatcher = new EventWatcher(t, animation, 'cancel');
+
+  await animation.ready;
+  animation.cancel();
+
+  await eventWatcher.wait_for('cancel');
+
+  assert_equals(animation.effect.target.parentNode, null,
+    'cancel event should be fired for the animation on an orphaned element');
+}, 'Canceling an animation should fire cancel event on orphaned element');
+
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
index c099950b..463ce24 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
@@ -17,5 +17,6 @@
 FAIL An exception should be thrown if the effective playback rate is zero promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
 FAIL An exception should be thrown when finishing if the effective playback rate is positive and the target effect end is infinity promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
 FAIL An exception is NOT thrown when finishing if the effective playback rate is negative and the target effect end is infinity promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
+PASS Finishing an animation fires finish event on orphaned element
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/finishing-an-animation.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/finishing-an-animation.html
index 833f074d..cb824ae 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/finishing-an-animation.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/animations/finishing-an-animation.html
@@ -284,5 +284,20 @@
 }, 'An exception is NOT thrown when finishing if the effective playback rate'
    + ' is negative and the target effect end is infinity');
 
+promise_test(async t => {
+  const div = createDiv(t);
+  const animation = div.animate({}, 100 * MS_PER_SEC);
+  div.remove();
+
+  const eventWatcher = new EventWatcher(t, animation, 'finish');
+
+  await animation.ready;
+  animation.finish();
+
+  await eventWatcher.wait_for('finish');
+  assert_equals(animation.effect.target.parentNode, null,
+    'finish event should be fired for the animation on an orphaned element');
+}, 'Finishing an animation fires finish event on orphaned element');
+
 </script>
 </body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/timelines/update-and-send-events.html b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/timelines/update-and-send-events.html
new file mode 100644
index 0000000..0134815
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/timing-model/timelines/update-and-send-events.html
@@ -0,0 +1,191 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>Update animations and send events</title>
+<link rel="help" href="https://drafts.csswg.org/web-animations/#update-animations-and-send-events">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="../../testcommon.js"></script>
+<div id="log"></div>
+<script>
+'use strict';
+
+promise_test(async t => {
+  const div = createDiv(t);
+  const animation = div.animate(null, 100 * MS_PER_SEC);
+
+  // The ready promise should be resolved as part of micro-task checkpoint
+  // after updating the current time of all timeslines in the procedure to
+  // "update animations and send events".
+  await animation.ready;
+
+  let rAFReceived = false;
+  requestAnimationFrame(() => {
+    rAFReceived = true;
+  });
+
+  const eventWatcher = new EventWatcher(t, animation, 'cancel');
+  animation.cancel();
+
+  await eventWatcher.wait_for('cancel');
+
+  assert_false(rAFReceived,
+    'cancel event should be fired before requestAnimationFrame');
+}, 'Fires cancel event before requestAnimationFrame');
+
+promise_test(async t => {
+  const div = createDiv(t);
+  const animation = div.animate(null, 100 * MS_PER_SEC);
+
+  // Like the above test, the ready promise should be resolved micro-task
+  // checkpoint after updating the current time of all timeslines in the
+  // procedure to "update animations and send events".
+  await animation.ready;
+
+  let rAFReceived = false;
+  requestAnimationFrame(() => {
+    rAFReceived = true;
+  });
+
+  const eventWatcher = new EventWatcher(t, animation, 'finish');
+  animation.finish();
+
+  await eventWatcher.wait_for('finish');
+
+  assert_false(rAFReceived,
+    'finish event should be fired before requestAnimationFrame');
+}, 'Fires finish event before requestAnimationFrame');
+
+function animationType(anim) {
+  if (anim instanceof CSSAnimation) {
+    return 'CSSAnimation';
+  } else if (anim instanceof CSSTransition) {
+    return 'CSSTransition';
+  } else {
+    return 'ScriptAnimation';
+  }
+}
+
+promise_test(async t => {
+  createStyle(t, { '@keyframes anim': '' });
+  const div = createDiv(t);
+
+  getComputedStyle(div).marginLeft;
+  div.style = 'animation: anim 100s; ' +
+              'transition: margin-left 100s; ' +
+              'margin-left: 100px;';
+  div.animate(null, 100 * MS_PER_SEC);
+  const animations = div.getAnimations();
+
+  let receivedEvents = [];
+  animations.forEach(anim => {
+    anim.onfinish = event => {
+      receivedEvents.push({
+        type: animationType(anim) + ':' + event.type,
+        timeStamp: event.timeStamp
+      });
+    };
+  });
+
+  await Promise.all(animations.map(anim => anim.ready));
+
+  // Setting current time to the time just before the effect end.
+  animations.forEach(anim => anim.currentTime = 100 * MS_PER_SEC - 1);
+
+  await waitForNextFrame();
+
+  assert_array_equals(receivedEvents.map(event => event.type),
+    [ 'CSSTransition:finish', 'CSSAnimation:finish',
+      'ScriptAnimation:finish' ],
+    'finish events for various animation type should be sorted by composite ' +
+    'order');
+}, 'Sorts finish events by composite order');
+
+promise_test(async t => {
+  createStyle(t, { '@keyframes anim': '' });
+  const div = createDiv(t);
+
+  let receivedEvents = [];
+  function receiveEvent(type, timeStamp) {
+    receivedEvents.push({ type, timeStamp });
+  }
+
+  div.onanimationcancel = event => {
+    receiveEvent(event.type, event.timeStamp);
+  };
+  div.ontransitioncancel = event => {
+    receiveEvent(event.type, event.timeStamp);
+  };
+
+  getComputedStyle(div).marginLeft;
+  div.style = 'animation: anim 100s; ' +
+              'transition: margin-left 100s; ' +
+              'margin-left: 100px;';
+  div.animate(null, 100 * MS_PER_SEC);
+  const animations = div.getAnimations();
+
+  animations.forEach(anim => {
+    anim.oncancel = event => {
+      receiveEvent(animationType(anim) + ':' + event.type, event.timeStamp);
+    };
+  });
+
+  await Promise.all(animations.map(anim => anim.ready));
+
+  const timeInAnimationReady = document.timeline.currentTime;
+
+  // Call cancel() in reverse composite order.  I.e. canceling for script
+  // animation happen first, then for CSS animation and CSS transition.
+  // 'cancel' events for these animations should be sorted by composite
+  // order.
+  animations.reverse().forEach(anim => anim.cancel());
+
+  // requestAnimationFrame callback which is actually the _same_ frame since we
+  // are currently operating in the `ready` callbac of the animations which
+  // happens as part of the "Update animations and send events" procedure
+  // _before_ we run animation frame callbacks.
+  await waitForAnimationFrames(1);
+
+  assert_times_equal(timeInAnimationReady, document.timeline.currentTime,
+    'A rAF callback should happen in the same frame');
+
+  assert_array_equals(receivedEvents.map(event => event.type),
+    // This ordering needs more clarification in the spec, but the intention is
+    // that the cancel playback event fires before the equivalent CSS cancel
+    // event in each case.
+    [ 'CSSTransition:cancel', 'CSSAnimation:cancel', 'ScriptAnimation:cancel',
+      'transitioncancel', 'animationcancel' ],
+    'cancel events should be sorted by composite order');
+}, 'Sorts cancel events by composite order');
+
+promise_test(async t => {
+  const div = createDiv(t);
+  getComputedStyle(div).marginLeft;
+  div.style = 'transition: margin-left 100s; margin-left: 100px;';
+  const anim = div.getAnimations()[0];
+
+  let receivedEvents = [];
+  anim.oncancel = event => {
+    receivedEvents.push(event);
+  };
+
+  const eventWatcher = new EventWatcher(t, div, 'transitionstart');
+  await eventWatcher.wait_for('transitionstart');
+
+  const timeInEventCallback = document.timeline.currentTime;
+
+  // Calling cancel() queues a cancel event
+  anim.cancel();
+
+  await waitForAnimationFrames(1);
+  assert_times_equal(timeInEventCallback, document.timeline.currentTime,
+    'A rAF callback should happen in the same frame');
+
+  assert_array_equals(receivedEvents, [],
+    'The queued cancel event shouldn\'t be dispatched in the same frame');
+
+  await waitForAnimationFrames(1);
+  assert_array_equals(receivedEvents.map(event => event.type), ['cancel'],
+    'The cancel event should be dispatched in a later frame');
+}, 'Queues a cancel event in transitionstart event callback');
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/fast/scroll-snap/animate-fling-to-snap-points.html b/third_party/WebKit/LayoutTests/fast/scroll-snap/animate-fling-to-snap-points.html
new file mode 100644
index 0000000..c3ad5f5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/scroll-snap/animate-fling-to-snap-points.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/gesture-util.js"></script>
+<style>
+div {
+  position: absolute;
+}
+#scroller {
+  width: 500px;
+  height: 500px;
+  overflow: scroll;
+  scroll-snap-type: both mandatory;
+  border: solid black 5px;
+}
+#space {
+  width: 2000px;
+  height: 2000px;
+}
+.target {
+  width: 200px;
+  height: 200px;
+  scroll-snap-align: start;
+  background-color: blue;
+}
+</style>
+
+<div id="scroller">
+  <div id="space"></div>
+  <div class="target" style="left: 0px; top: 0px;"></div>
+  <div class="target" style="left: 80px; top: 80px;"></div>
+  <div class="target" style="left: 200px; top: 200px;"></div>
+</div>
+
+<script>
+var scroller = document.getElementById("scroller");
+
+function scrollLeft() {
+  return scroller.scrollLeft;
+}
+
+promise_test (async () => {
+  scroller.scrollTo(0, 0);
+  await smoothScroll(100, 200, 200, GestureSourceType.TOUCH_INPUT, 'downright', SPEED_INSTANT);
+  await waitForAnimationEnd(scrollLeft, 700, 10);
+  await waitFor( () => {
+    return approx_equals(scroller.scrollLeft, 80, 1) &&
+           approx_equals(scroller.scrollTop, 80, 1);
+  });
+}, "Without fling enabled, the scroll ends at the closest snap point to the scroll destination.");
+
+promise_test (async () => {
+  scroller.scrollTo(0, 0);
+  await swipe(100, 200, 200, 'upleft', 1000);
+  await waitForAnimationEnd(scrollLeft, 1000, 30);
+  await waitFor( () => {
+    return approx_equals(scroller.scrollLeft, 200, 1) &&
+           approx_equals(scroller.scrollTop, 200, 1);
+  });
+}, "With fling enabled, the scroll ends at the closest snap point to the fling destination.")
+
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block-expected.png
index 564637b..554d0e3 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block2-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block2-expected.png
index 564637b..554d0e3 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block2-expected.png
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/block/float/overhanging-float-remove-from-fixed-position-block2-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/multicol/break-before-first-line-in-first-child-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/multicol/break-before-first-line-in-first-child-expected.txt
new file mode 100644
index 0000000..6275778
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/multicol/break-before-first-line-in-first-child-expected.txt
@@ -0,0 +1,5 @@
+Test that the first block in a multicol container refuses a pagination strut from a line.
+
+There should be a blue square below.
+
+PASS
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/multicol/nested-one-line-in-inner-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/multicol/nested-one-line-in-inner-expected.txt
new file mode 100644
index 0000000..e139ec7f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/multicol/nested-one-line-in-inner-expected.txt
@@ -0,0 +1,5 @@
+Test that an inner multicol with only one line makes the outer multicol tall enough to contain it.
+
+There should be a blue square below.
+
+PASS
diff --git a/third_party/WebKit/LayoutTests/http/tests/cache/resources/stale-script.php b/third_party/WebKit/LayoutTests/http/tests/cache/resources/stale-script.php
new file mode 100644
index 0000000..ada34e7
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/cache/resources/stale-script.php
@@ -0,0 +1,8 @@
+<?php
+$last_modified = gmdate(DATE_RFC1123, time() - 1);
+
+header('Cache-Control: private, max-age=0, stale-while-revalidate=10');
+header('Last-Modified: ' . $last_modified);
+header('Content-Type: application/javascript');
+echo('report("' . uniqid() . '");');
+?>
diff --git a/third_party/WebKit/LayoutTests/http/tests/cache/stale-while-revalidate.php b/third_party/WebKit/LayoutTests/http/tests/cache/stale-while-revalidate.php
new file mode 100644
index 0000000..19d35b6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/cache/stale-while-revalidate.php
@@ -0,0 +1,46 @@
+<?php
+# Origin Trial header generated via:
+# generate_token.py http://127.0.0.1:8000 StaleWhileRevalidate --expire-timestamp=2000000000
+header('Origin-Trial: ', 'Ar+YcsxZApSlJwPStNXfjSZnlQi2VhVaelBM+U9oP761uOB73mfsBwYDg1VUYGn1GDIXnjzEp6PR8PMi2dRPPgIAAABceyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiU3RhbGVXaGlsZVJldmFsaWRhdGUiLCAiZXhwaXJ5IjogMjAwMDAwMDAwMH0=');
+header('Content-Type: text/html');
+?>
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Tests Stale While Revalidate Works when origin trial is enabled</title>
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<body>
+<script>
+var last_modified;
+var last_modified_count = 0;
+
+// The script will call report via a uniquely generated ID on the subresource.
+// If it is a cache hit the ID will be the same and the test will pass.
+function report(mod) {
+  console.log('report ' + mod);
+  if (!last_modified) {
+    last_modified = mod;
+    last_modified_count = 1;
+  } else if (last_modified == mod) {
+    last_modified_count++;
+  }
+}
+
+async_test(t => {
+  window.onload = t.step_func(() => {
+    step_timeout(() => {
+      var script = document.createElement("script");
+      script.src = "resources/stale-script.php";
+      document.body.appendChild(script);
+      script.onload = t.step_func_done(() =>{
+        assert_true(last_modified_count == 2);
+      });
+    }, 0);
+  });
+}, 'Cache returns stale resource');
+
+var script = document.createElement("script");
+script.src = "resources/stale-script.php";
+document.body.appendChild(script);
+</script>
+</body>
diff --git a/third_party/WebKit/LayoutTests/platform/android/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt b/third_party/WebKit/LayoutTests/platform/android/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
new file mode 100644
index 0000000..c099950b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/android/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
@@ -0,0 +1,21 @@
+This is a testharness.js-based test.
+PASS Finishing an animation with a zero playback rate throws
+PASS Finishing an infinite animation throws
+PASS Finishing an animation seeks to the end time
+PASS Finishing an animation with a current time past the effect end jumps back to the end
+PASS Finishing a reversed animation jumps to zero time
+PASS Finishing a reversed animation with a current time less than zero makes it jump back to zero
+PASS Finishing a paused animation resolves the start time
+FAIL Finishing a pause-pending animation resolves the pending task immediately and update the start time assert_false: expected false got undefined
+FAIL Finishing a pause-pending animation with negative playback rate resolves the pending task immediately assert_false: expected false got undefined
+FAIL Finishing an animation while play-pending resolves the pending task immediately assert_false: expected false got undefined
+PASS Finishing an animation during an aborted pause makes it finished immediately
+PASS Finishing an animation resolves the finished promise synchronously
+PASS Finishing an animation without a target resolves the finished promise synchronously
+PASS A pending ready promise is resolved and not replaced when the animation is finished
+FAIL A pending playback rate should be applied immediately when an animation is finished promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
+FAIL An exception should be thrown if the effective playback rate is zero promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
+FAIL An exception should be thrown when finishing if the effective playback rate is positive and the target effect end is infinity promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
+FAIL An exception is NOT thrown when finishing if the effective playback rate is negative and the target effect end is infinity promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/fuchsia/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt b/third_party/WebKit/LayoutTests/platform/fuchsia/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
new file mode 100644
index 0000000..c099950b
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/platform/fuchsia/external/wpt/web-animations/timing-model/animations/finishing-an-animation-expected.txt
@@ -0,0 +1,21 @@
+This is a testharness.js-based test.
+PASS Finishing an animation with a zero playback rate throws
+PASS Finishing an infinite animation throws
+PASS Finishing an animation seeks to the end time
+PASS Finishing an animation with a current time past the effect end jumps back to the end
+PASS Finishing a reversed animation jumps to zero time
+PASS Finishing a reversed animation with a current time less than zero makes it jump back to zero
+PASS Finishing a paused animation resolves the start time
+FAIL Finishing a pause-pending animation resolves the pending task immediately and update the start time assert_false: expected false got undefined
+FAIL Finishing a pause-pending animation with negative playback rate resolves the pending task immediately assert_false: expected false got undefined
+FAIL Finishing an animation while play-pending resolves the pending task immediately assert_false: expected false got undefined
+PASS Finishing an animation during an aborted pause makes it finished immediately
+PASS Finishing an animation resolves the finished promise synchronously
+PASS Finishing an animation without a target resolves the finished promise synchronously
+PASS A pending ready promise is resolved and not replaced when the animation is finished
+FAIL A pending playback rate should be applied immediately when an animation is finished promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
+FAIL An exception should be thrown if the effective playback rate is zero promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
+FAIL An exception should be thrown when finishing if the effective playback rate is positive and the target effect end is infinity promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
+FAIL An exception is NOT thrown when finishing if the effective playback rate is negative and the target effect end is infinity promise_test: Unhandled rejection with value: object "TypeError: animation.updatePlaybackRate is not a function"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/external/wpt/editing/run/forwarddelete-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/external/wpt/editing/run/forwarddelete-expected.txt
deleted file mode 100644
index 496b359..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/external/wpt/editing/run/forwarddelete-expected.txt
+++ /dev/null
@@ -1,6413 +0,0 @@
-This is a testharness.js-based test.
-Found 6409 tests; 6277 PASS, 132 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS [["forwarddelete",""]] "foo[]": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo[]</span>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<span>foo[]</span>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<span>foo[]</span>" compare innerHTML
-PASS [["forwarddelete",""]] "<span>foo[]</span>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo[]</span>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo[]</span>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo[]</span>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo[]</span>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo[]</span>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[]</p>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[]</p>" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[]</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo</span>{}<span>bar</span>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<span>foo</span>{}<span>bar</span>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<span>foo</span>{}<span>bar</span>" compare innerHTML
-PASS [["forwarddelete",""]] "<span>foo</span>{}<span>bar</span>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo</span>{}<span>bar</span>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo</span>{}<span>bar</span>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo</span>{}<span>bar</span>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo</span>{}<span>bar</span>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo</span>{}<span>bar</span>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo[</span><span>]bar</span>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<span>foo[</span><span>]bar</span>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<span>foo[</span><span>]bar</span>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<span>foo</span><span>bar</span>" but got "<span>foo</span><span>ar</span>"
-PASS [["forwarddelete",""]] "<span>foo[</span><span>]bar</span>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo[</span><span>]bar</span>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo[</span><span>]bar</span>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo[</span><span>]bar</span>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo[</span><span>]bar</span>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo[</span><span>]bar</span>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandIndeterm("stylewithcss") before
-FAIL [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandState("stylewithcss") beforeassert_equals: Wrong result returned expected false but got true
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<span style=display:none>bar</span>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<script>bar</script>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<script>bar</script>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<script>bar</script>baz" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<script>bar</script>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<script>bar</script>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<script>bar</script>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<script>bar</script>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<script>bar</script>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<script>bar</script>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "fo[]&ouml;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "fo[]&ouml;bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "fo[]&ouml;bar" compare innerHTML
-PASS [["forwarddelete",""]] "fo[]&ouml;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "fo[]&ouml;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "fo[]&ouml;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "fo[]&ouml;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "fo[]&ouml;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "fo[]&ouml;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "fo[]o&#x308;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "fo[]o&#x308;bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "fo[]o&#x308;bar" compare innerHTML
-PASS [["forwarddelete",""]] "fo[]o&#x308;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "fo[]o&#x308;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "fo[]o&#x308;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "fo[]o&#x308;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "fo[]o&#x308;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "fo[]o&#x308;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "fo[]o&#x308;&#x327;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "fo[]o&#x308;&#x327;bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "fo[]o&#x308;&#x327;bar" compare innerHTML
-PASS [["forwarddelete",""]] "fo[]o&#x308;&#x327;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "fo[]o&#x308;&#x327;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "fo[]o&#x308;&#x327;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "fo[]o&#x308;&#x327;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "fo[]o&#x308;&#x327;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "fo[]o&#x308;&#x327;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "[]&ouml;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "[]&ouml;bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "[]&ouml;bar" compare innerHTML
-PASS [["forwarddelete",""]] "[]&ouml;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "[]&ouml;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "[]&ouml;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "[]&ouml;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "[]&ouml;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "[]&ouml;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "[]o&#x308;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "[]o&#x308;bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "[]o&#x308;bar" compare innerHTML
-PASS [["forwarddelete",""]] "[]o&#x308;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "[]o&#x308;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "[]o&#x308;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "[]o&#x308;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "[]o&#x308;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "[]o&#x308;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "[]o&#x308;&#x327;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "[]o&#x308;&#x327;bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "[]o&#x308;&#x327;bar" compare innerHTML
-PASS [["forwarddelete",""]] "[]o&#x308;&#x327;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "[]o&#x308;&#x327;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "[]o&#x308;&#x327;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "[]o&#x308;&#x327;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "[]o&#x308;&#x327;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "[]o&#x308;&#x327;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;" compare innerHTML
-PASS [["forwarddelete",""]] "[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "[]&#x5e9;&#x5c1;&#x5b8;&#x5dc;&#x5d5;&#x5b9;&#x5dd;" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;" compare innerHTML
-PASS [["forwarddelete",""]] "&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "&#x5e9;&#x5c1;&#x5b8;&#x5dc;[]&#x5d5;&#x5b9;&#x5dd;" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[]</p>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[]</p>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[]</p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<br></p><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<br></p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[]<br></p>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[]<br></p>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[]<br></p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<br></p>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<br></p>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<br></p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<br></p>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<br></p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<br><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>{}<br></p>foo": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>{}<br></p>foo" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p>{}<br></p>foo" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p>" but got "<p>foo<br></p>"
-PASS [["forwarddelete",""]] "<p>{}<br></p>foo" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>{}<br></p>foo" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>{}<br></p>foo" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>{}<br></p>foo" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>{}<br></p>foo" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>{}<br></p>foo" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>{}<span><br></span></p>foo": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>{}<span><br></span></p>foo" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p>{}<span><br></span></p>foo" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p>" but got "<p>foo<br></p>"
-PASS [["forwarddelete",""]] "<p>{}<span><br></span></p>foo" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>{}<span><br></span></p>foo" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>{}<span><br></span></p>foo" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>{}<span><br></span></p>foo" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>{}<span><br></span></p>foo" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>{}<span><br></span></p>foo" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p><span><br></span>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<br><p><span><br></span>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<span><br></span><p><span><br></span>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo" but got "foo<p></p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{}<p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo" but got "foo<p></p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{}<p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>{}</table>foo": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tr><td>{}</table>foo" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tr><td>{}</table>foo" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tr><td>{}</table>foo" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>{}</table>foo" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>{}</table>foo" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>{}</table>foo" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>{}</table>foo" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>{}</table>foo" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>{}<br></table>foo": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tr><td>{}<br></table>foo" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tr><td>{}<br></table>foo" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tr><td>{}<br></table>foo" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>{}<br></table>foo" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>{}<br></table>foo" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>{}<br></table>foo" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>{}<br></table>foo" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>{}<br></table>foo" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>{}<span><br></span></table>foo": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tr><td>{}<span><br></span></table>foo" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tr><td>{}<span><br></span></table>foo" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tr><td>{}<span><br></span></table>foo" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>{}<span><br></span></table>foo" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>{}<span><br></span></table>foo" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>{}<span><br></span></table>foo" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>{}<span><br></span></table>foo" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>{}<span><br></span></table>foo" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]</p><div><p>bar</p></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[]</p></div><div><p>bar</p></div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><p>foo[]</p></div>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div><p>foo[]</p></div>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div><p>foo[]</p></div>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<div><p>foo[]</p></div>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><p>foo[]</p></div>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><p>foo[]</p></div>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><p>foo[]</p></div>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><p>foo[]</p></div>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><p>foo[]</p></div>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><p>bar</p></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[]</div><div>bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[]</pre>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<pre>foo[]</pre>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<pre>foo[]</pre>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<pre>foo[]</pre>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[]</pre>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[]</pre>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[]</pre>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[]</pre>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[]</pre>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<br>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<br>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<br>bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<br>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<br>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<br>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<br>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<br>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<br>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[]</b><br>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<b>foo[]</b><br>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<b>foo[]</b><br>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<b>foo[]</b><br>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[]</b><br>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[]</b><br>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[]</b><br>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[]</b><br>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[]</b><br>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<hr>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<hr>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<hr>bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<hr>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<hr>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<hr>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<hr>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<hr>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<hr>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<hr><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[]<hr><p>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[]<hr><p>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[]<hr><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<hr><p>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<hr><p>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<hr><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<hr><p>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<hr><p>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><p>bar</p>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><p>bar</p>" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><br><p>bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><br><p>bar</p>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><br><p>bar</p>" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><br><p>bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><br><p>bar</p>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><br><p>bar</p>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><br><p>bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><br><p>bar</p>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p><br><br><p>bar</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p><img src=/img/lion.svg><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[]</p><img src=/img/lion.svg><p>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[]</p><img src=/img/lion.svg><p>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[]</p><img src=/img/lion.svg><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p><img src=/img/lion.svg><p>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p><img src=/img/lion.svg><p>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]</p><img src=/img/lion.svg><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p><img src=/img/lion.svg><p>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]</p><img src=/img/lion.svg><p>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<img src=/img/lion.svg>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<img src=/img/lion.svg>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<img src=/img/lion.svg>bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<img src=/img/lion.svg>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<img src=/img/lion.svg>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<img src=/img/lion.svg>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<img src=/img/lion.svg>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<img src=/img/lion.svg>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<img src=/img/lion.svg>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a>bar</a>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<a>bar</a>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<a>bar</a>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<a>bar</a>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a>bar</a>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a>bar</a>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a>bar</a>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a>bar</a>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a>bar</a>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a href=/>bar</a>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<a href=/>bar</a>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<a href=/>bar</a>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<a href=/>bar</a>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a href=/>bar</a>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a href=/>bar</a>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a href=/>bar</a>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a href=/>bar</a>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a href=/>bar</a>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a name=abc>bar</a>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<a name=abc>bar</a>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<a name=abc>bar</a>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<a name=abc>bar</a>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a name=abc>bar</a>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a name=abc>bar</a>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a name=abc>bar</a>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a name=abc>bar</a>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a name=abc>bar</a>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a href=/ name=abc>bar</a>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<a href=/ name=abc>bar</a>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<a href=/ name=abc>bar</a>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<a href=/ name=abc>bar</a>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a href=/ name=abc>bar</a>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a href=/ name=abc>bar</a>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<a href=/ name=abc>bar</a>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a href=/ name=abc>bar</a>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<a href=/ name=abc>bar</a>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a>bar</a></span>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<span><a>bar</a></span>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<span><a>bar</a></span>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<span><a>bar</a></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a>bar</a></span>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a>bar</a></span>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a>bar</a></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a>bar</a></span>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a>bar</a></span>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a href=/>bar</a></span>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<span><a href=/>bar</a></span>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<span><a href=/>bar</a></span>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<span><a href=/>bar</a></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a href=/>bar</a></span>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a href=/>bar</a></span>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a href=/>bar</a></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a href=/>bar</a></span>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a href=/>bar</a></span>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a name=abc>bar</a></span>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<span><a name=abc>bar</a></span>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<span><a name=abc>bar</a></span>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<span><a name=abc>bar</a></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a name=abc>bar</a></span>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a name=abc>bar</a></span>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a name=abc>bar</a></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a name=abc>bar</a></span>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a name=abc>bar</a></span>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a href=/ name=abc>bar</a></span>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<span><a href=/ name=abc>bar</a></span>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<span><a href=/ name=abc>bar</a></span>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<span><a href=/ name=abc>bar</a></span>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a href=/ name=abc>bar</a></span>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a href=/ name=abc>bar</a></span>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><a href=/ name=abc>bar</a></span>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a href=/ name=abc>bar</a></span>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><a href=/ name=abc>bar</a></span>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<a>foo[]</a>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<a>foo[]</a>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<a>foo[]</a>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<a>foo[]</a>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<a>foo[]</a>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<a>foo[]</a>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<a>foo[]</a>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<a>foo[]</a>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<a>foo[]</a>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<a href=/>foo[]</a>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<a href=/>foo[]</a>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<a href=/>foo[]</a>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<a href=/>foo[]</a>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<a href=/>foo[]</a>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<a href=/>foo[]</a>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<a href=/>foo[]</a>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<a href=/>foo[]</a>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<a href=/>foo[]</a>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<a name=abc>foo[]</a>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<a name=abc>foo[]</a>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<a name=abc>foo[]</a>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<a name=abc>foo[]</a>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<a name=abc>foo[]</a>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<a name=abc>foo[]</a>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<a name=abc>foo[]</a>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<a name=abc>foo[]</a>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<a name=abc>foo[]</a>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<a href=/ name=abc>foo[]</a>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<a href=/ name=abc>foo[]</a>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<a href=/ name=abc>foo[]</a>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<a href=/ name=abc>foo[]</a>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<a href=/ name=abc>foo[]</a>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<a href=/ name=abc>foo[]</a>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<a href=/ name=abc>foo[]</a>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<a href=/ name=abc>foo[]</a>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<a href=/ name=abc>foo[]</a>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo []&nbsp;": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo []&nbsp;" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo []&nbsp;" compare innerHTML
-PASS [["forwarddelete",""]] "foo []&nbsp;" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo []&nbsp;" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo []&nbsp;" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo []&nbsp;" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo []&nbsp;" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo []&nbsp;" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "[]&nbsp; foo": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "[]&nbsp; foo" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "[]&nbsp; foo" compare innerHTML
-PASS [["forwarddelete",""]] "[]&nbsp; foo" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "[]&nbsp; foo" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "[]&nbsp; foo" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "[]&nbsp; foo" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "[]&nbsp; foo" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "[]&nbsp; foo" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[] &nbsp;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[] &nbsp;bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[] &nbsp;bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[] &nbsp;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[] &nbsp;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[] &nbsp;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[] &nbsp;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[] &nbsp;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[] &nbsp;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]&nbsp; bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]&nbsp; bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]&nbsp; bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]&nbsp; bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]&nbsp; bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]&nbsp; bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]&nbsp; bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]&nbsp; bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]&nbsp; bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]&nbsp;&nbsp;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]&nbsp;&nbsp;bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]&nbsp;&nbsp;bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]&nbsp;&nbsp;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]&nbsp;&nbsp;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]&nbsp;&nbsp;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]&nbsp;&nbsp;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]&nbsp;&nbsp;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]&nbsp;&nbsp;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]  bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]  bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]  bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]  bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]  bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]  bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]  bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]  bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]  bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[] &nbsp; bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[] &nbsp; bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[] &nbsp; bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[] &nbsp; bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[] &nbsp; bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[] &nbsp; bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[] &nbsp; bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[] &nbsp; bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[] &nbsp; bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo []&nbsp; bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo []&nbsp; bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo []&nbsp; bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo []&nbsp; bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo []&nbsp; bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo []&nbsp; bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo []&nbsp; bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo []&nbsp; bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo []&nbsp; bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo &nbsp;[] bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo &nbsp;[] bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo &nbsp;[] bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo &nbsp;[] bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo &nbsp;[] bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo &nbsp;[] bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo &nbsp;[] bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo &nbsp;[] bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo &nbsp;[] bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[] <span>&nbsp;</span> bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[] <span>&nbsp;</span> bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[] <span>&nbsp;</span> bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[] <span>&nbsp;</span> bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[] <span>&nbsp;</span> bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[] <span>&nbsp;</span> bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[] <span>&nbsp;</span> bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[] <span>&nbsp;</span> bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[] <span>&nbsp;</span> bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo []<span>&nbsp;</span> bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo []<span>&nbsp;</span> bar" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "foo []<span>&nbsp;</span> bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo&nbsp; bar" but got "foo &nbsp;bar"
-PASS [["forwarddelete",""]] "foo []<span>&nbsp;</span> bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo []<span>&nbsp;</span> bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo []<span>&nbsp;</span> bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo []<span>&nbsp;</span> bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo []<span>&nbsp;</span> bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo []<span>&nbsp;</span> bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo <span>&nbsp;</span>[] bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo <span>&nbsp;</span>[] bar" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "foo <span>&nbsp;</span>[] bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo&nbsp;<span> </span>bar" but got "foo <span>&nbsp;</span>bar"
-PASS [["forwarddelete",""]] "foo <span>&nbsp;</span>[] bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo <span>&nbsp;</span>[] bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo <span>&nbsp;</span>[] bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo <span>&nbsp;</span>[] bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo <span>&nbsp;</span>[] bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo <span>&nbsp;</span>[] bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[] </b>&nbsp;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<b>foo[] </b>&nbsp;bar" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<b>foo[] </b>&nbsp;bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<b>foo</b> bar" but got "<b>foo</b>&nbsp;bar"
-PASS [["forwarddelete",""]] "<b>foo[] </b>&nbsp;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[] </b>&nbsp;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[] </b>&nbsp;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[] </b>&nbsp;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[] </b>&nbsp;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[] </b>&nbsp;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b> bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b> bar" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<b>foo[]&nbsp;</b> bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<b>foo</b> bar" but got "<b>foo</b>&nbsp;bar"
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b> bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b> bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b> bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b> bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b> bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b> bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b>&nbsp;bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b>&nbsp;bar" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<b>foo[]&nbsp;</b>&nbsp;bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<b>foo</b> bar" but got "<b>foo</b>&nbsp;bar"
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b>&nbsp;bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b>&nbsp;bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b>&nbsp;bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b>&nbsp;bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b>&nbsp;bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[]&nbsp;</b>&nbsp;bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[] </b> bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<b>foo[] </b> bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<b>foo[] </b> bar" compare innerHTML
-PASS [["forwarddelete",""]] "<b>foo[] </b> bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[] </b> bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[] </b> bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[] </b> bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[] </b> bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[] </b> bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo []&nbsp;</pre>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<pre>foo []&nbsp;</pre>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<pre>foo []&nbsp;</pre>" compare innerHTML
-PASS [["forwarddelete",""]] "<pre>foo []&nbsp;</pre>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo []&nbsp;</pre>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo []&nbsp;</pre>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo []&nbsp;</pre>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo []&nbsp;</pre>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo []&nbsp;</pre>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>[]&nbsp; foo</pre>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<pre>[]&nbsp; foo</pre>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<pre>[]&nbsp; foo</pre>" compare innerHTML
-PASS [["forwarddelete",""]] "<pre>[]&nbsp; foo</pre>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>[]&nbsp; foo</pre>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>[]&nbsp; foo</pre>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>[]&nbsp; foo</pre>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>[]&nbsp; foo</pre>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>[]&nbsp; foo</pre>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[] &nbsp;bar</pre>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<pre>foo[] &nbsp;bar</pre>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<pre>foo[] &nbsp;bar</pre>" compare innerHTML
-PASS [["forwarddelete",""]] "<pre>foo[] &nbsp;bar</pre>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[] &nbsp;bar</pre>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[] &nbsp;bar</pre>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[] &nbsp;bar</pre>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[] &nbsp;bar</pre>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[] &nbsp;bar</pre>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[]&nbsp; bar</pre>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<pre>foo[]&nbsp; bar</pre>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<pre>foo[]&nbsp; bar</pre>" compare innerHTML
-PASS [["forwarddelete",""]] "<pre>foo[]&nbsp; bar</pre>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[]&nbsp; bar</pre>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[]&nbsp; bar</pre>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[]&nbsp; bar</pre>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[]&nbsp; bar</pre>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[]&nbsp; bar</pre>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[]  bar</pre>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<pre>foo[]  bar</pre>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<pre>foo[]  bar</pre>" compare innerHTML
-PASS [["forwarddelete",""]] "<pre>foo[]  bar</pre>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[]  bar</pre>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[]  bar</pre>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<pre>foo[]  bar</pre>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[]  bar</pre>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<pre>foo[]  bar</pre>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo []&nbsp;</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo []&nbsp;</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo []&nbsp;</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo []&nbsp;</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo []&nbsp;</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo []&nbsp;</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo []&nbsp;</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo []&nbsp;</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo []&nbsp;</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>[]&nbsp; foo</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre>[]&nbsp; foo</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre>[]&nbsp; foo</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre>[]&nbsp; foo</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>[]&nbsp; foo</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>[]&nbsp; foo</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>[]&nbsp; foo</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>[]&nbsp; foo</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>[]&nbsp; foo</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[] &nbsp;bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[] &nbsp;bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[] &nbsp;bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[] &nbsp;bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[] &nbsp;bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[] &nbsp;bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[] &nbsp;bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[] &nbsp;bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[] &nbsp;bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]&nbsp; bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]&nbsp; bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]&nbsp; bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]&nbsp; bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]&nbsp; bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]&nbsp; bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]&nbsp; bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]&nbsp; bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]&nbsp; bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]  bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]  bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]  bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]  bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]  bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]  bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]  bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]  bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre>foo[]  bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo []&nbsp;</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo []&nbsp;</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo []&nbsp;</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo []&nbsp;</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo []&nbsp;</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo []&nbsp;</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo []&nbsp;</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo []&nbsp;</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo []&nbsp;</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>[]&nbsp; foo</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>[]&nbsp; foo</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>[]&nbsp; foo</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>[]&nbsp; foo</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>[]&nbsp; foo</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>[]&nbsp; foo</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>[]&nbsp; foo</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>[]&nbsp; foo</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>[]&nbsp; foo</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[] &nbsp;bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]&nbsp; bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]  bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]  bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]  bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]  bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]  bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]  bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]  bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]  bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-wrap>foo[]  bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo []&nbsp;</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo []&nbsp;</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo []&nbsp;</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo []&nbsp;</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo []&nbsp;</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo []&nbsp;</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo []&nbsp;</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo []&nbsp;</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo []&nbsp;</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>[]&nbsp; foo</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>[]&nbsp; foo</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>[]&nbsp; foo</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>[]&nbsp; foo</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>[]&nbsp; foo</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>[]&nbsp; foo</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>[]&nbsp; foo</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>[]&nbsp; foo</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>[]&nbsp; foo</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[] &nbsp;bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[] &nbsp;bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[] &nbsp;bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[] &nbsp;bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[] &nbsp;bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[] &nbsp;bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[] &nbsp;bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[] &nbsp;bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[] &nbsp;bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]&nbsp; bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]&nbsp; bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]&nbsp; bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]&nbsp; bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]&nbsp; bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]&nbsp; bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]&nbsp; bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]&nbsp; bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]&nbsp; bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]  bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]  bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]  bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]  bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]  bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]  bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]  bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]  bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:pre-line>foo[]  bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo []&nbsp;</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo []&nbsp;</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo []&nbsp;</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo []&nbsp;</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo []&nbsp;</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo []&nbsp;</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo []&nbsp;</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo []&nbsp;</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo []&nbsp;</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>[]&nbsp; foo</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>[]&nbsp; foo</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>[]&nbsp; foo</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>[]&nbsp; foo</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>[]&nbsp; foo</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>[]&nbsp; foo</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>[]&nbsp; foo</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>[]&nbsp; foo</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>[]&nbsp; foo</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[] &nbsp;bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[] &nbsp;bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[] &nbsp;bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[] &nbsp;bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[] &nbsp;bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[] &nbsp;bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[] &nbsp;bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[] &nbsp;bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[] &nbsp;bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]&nbsp; bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]&nbsp; bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]&nbsp; bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]&nbsp; bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]&nbsp; bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]&nbsp; bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]&nbsp; bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]&nbsp; bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]&nbsp; bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]  bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]  bar</div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]  bar</div>" compare innerHTML
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]  bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]  bar</div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]  bar</div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]  bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]  bar</div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div style=white-space:nowrap>foo[]  bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<table><tr><td>bar</table>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<table><tr><td>bar</table>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<table><tr><td>bar</table>baz" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<table><tr><td>bar</table>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<table><tr><td>bar</table>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<table><tr><td>bar</table>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<table><tr><td>bar</table>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<table><tr><td>bar</table>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<table><tr><td>bar</table>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table>baz" compare innerHTML
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<table><tr><td>bar</table><p>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[]<table><tr><td>bar</table><p>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[]<table><tr><td>bar</table><p>baz" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[]<table><tr><td>bar</table><p>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<table><tr><td>bar</table><p>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<table><tr><td>bar</table><p>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<table><tr><td>bar</table><p>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<table><tr><td>bar</table><p>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<table><tr><td>bar</table><p>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td>bar</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td>bar</table>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td>bar</table>" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td>bar</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td>bar</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td>bar</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td>bar</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td>bar</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td>bar</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td>bar</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td>bar</table>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td>bar</table>" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td>bar</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td>bar</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td>bar</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td>bar</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td>bar</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td>bar</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<br><table><tr><td>bar</table>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<br><table><tr><td>bar</table>baz" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "foo[]<br><table><tr><td>bar</table>baz" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<table><tbody><tr><td>bar</td></tr></tbody></table>baz" but got "foo<br><table><tbody><tr><td>bar</td></tr></tbody></table>baz"
-PASS [["forwarddelete",""]] "foo[]<br><table><tr><td>bar</table>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<br><table><tr><td>bar</table>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<br><table><tr><td>bar</table>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<br><table><tr><td>bar</table>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<br><table><tr><td>bar</table>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<br><table><tr><td>bar</table>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]<br></table>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]<br></table>baz" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "foo<table><tr><td>bar[]<br></table>baz" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<table><tbody><tr><td>bar</td></tr></tbody></table>baz" but got "foo<table><tbody><tr><td>bar<br></td></tr></tbody></table>baz"
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]<br></table>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]<br></table>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]<br></table>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]<br></table>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]<br></table>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]<br></table>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<br><table><tr><td>bar</table><p>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[]<br><table><tr><td>bar</table><p>baz" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p>foo[]<br><table><tr><td>bar</table><p>baz" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p><table><tbody><tr><td>bar</td></tr></tbody></table><p>baz</p>" but got "<p>foo<br></p><table><tbody><tr><td>bar</td></tr></tbody></table><p>baz</p>"
-PASS [["forwarddelete",""]] "<p>foo[]<br><table><tr><td>bar</table><p>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<br><table><tr><td>bar</table><p>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<br><table><tr><td>bar</table><p>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[]<br><table><tr><td>bar</table><p>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<br><table><tr><td>bar</table><p>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[]<br><table><tr><td>bar</table><p>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>bar[]<br></table><p>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>bar[]<br></table><p>baz" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p>foo<table><tr><td>bar[]<br></table><p>baz" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p><table><tbody><tr><td>bar</td></tr></tbody></table><p>baz</p>" but got "<p>foo</p><table><tbody><tr><td>bar<br></td></tr></tbody></table><p>baz</p>"
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>bar[]<br></table><p>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>bar[]<br></table><p>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>bar[]<br></table><p>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>bar[]<br></table><p>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>bar[]<br></table><p>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>bar[]<br></table><p>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><td>bar</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><td>bar</table>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<table><tr><td>foo[]<br><td>bar</table>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<table><tbody><tr><td>foo</td><td>bar</td></tr></tbody></table>" but got "<table><tbody><tr><td>foo<br></td><td>bar</td></tr></tbody></table>"
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><td>bar</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><td>bar</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><td>bar</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><td>bar</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><td>bar</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><td>bar</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><tr><td>bar</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><tr><td>bar</table>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<table><tr><td>foo[]<br><tr><td>bar</table>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<table><tbody><tr><td>foo</td></tr><tr><td>bar</td></tr></tbody></table>" but got "<table><tbody><tr><td>foo<br></td></tr><tr><td>bar</td></tr></tbody></table>"
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><tr><td>bar</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><tr><td>bar</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><tr><td>bar</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><tr><td>bar</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><tr><td>bar</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<br><tr><td>bar</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table><br>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table><br>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table><br>baz" compare innerHTML
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table><br>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table><br>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table><br>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table><br>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table><br>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<table><tr><td>bar[]</table><br>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<table><tr><td><hr>bar</table>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<table><tr><td><hr>bar</table>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<table><tr><td><hr>bar</table>baz" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<table><tr><td><hr>bar</table>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<table><tr><td><hr>bar</table>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<table><tr><td><hr>bar</table>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<table><tr><td><hr>bar</table>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<table><tr><td><hr>bar</table>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<table><tr><td><hr>bar</table>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td><hr>bar</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td><hr>bar</table>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td><hr>bar</table>" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td><hr>bar</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td><hr>bar</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td><hr>bar</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td><hr>bar</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td><hr>bar</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<td><hr>bar</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td><hr>bar</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td><hr>bar</table>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td><hr>bar</table>" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td><hr>bar</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td><hr>bar</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td><hr>bar</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td><hr>bar</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td><hr>bar</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tr><td>foo[]<tr><td><hr>bar</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<ol><li>bar<li>baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<ol><li>bar<li>baz</ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<ol><li>bar<li>baz</ol>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<ol><li>bar<li>baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<ol><li>bar<li>baz</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<ol><li>bar<li>baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<ol><li>bar<li>baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<ol><li>bar<li>baz</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<ol><li>bar<li>baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<br><ol><li>bar<li>baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<br><ol><li>bar<li>baz</ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<br><ol><li>bar<li>baz</ol>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<br><ol><li>bar<li>baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<br><ol><li>bar<li>baz</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<br><ol><li>bar<li>baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<br><ol><li>bar<li>baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<br><ol><li>bar<li>baz</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<br><ol><li>bar<li>baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar</ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar</ol>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br><li>bar</ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br><li>bar</ol>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar<br>baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar<br>baz</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo[]<li>bar<br>baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foobar<br>baz</li></ol>" but got "<ol><li>foobar</li><li>baz</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar<br>baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar<br>baz</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar<br>baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar<br>baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar<br>baz</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<li>bar<br>baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li><p>foo[]<li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li><p>foo[]<li>bar</ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li><p>foo[]<li>bar</ol>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li><p>foo[]<li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li><p>foo[]<li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li><p>foo[]<li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li><p>foo[]<li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li><p>foo[]<li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li><p>foo[]<li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<li><p>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[]<li><p>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<ul><li>bar</ul></ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[]<ul><li>bar</ul></ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo[]<ul><li>bar</ul></ol>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo[]<ul><li>bar</ul></ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<ul><li>bar</ul></ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<ul><li>bar</ul></ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<ul><li>bar</ul></ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<ul><li>bar</ul></ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<ul><li>bar</ul></ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<ol><ol><li>bar</ol></ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<ol><ol><li>bar</ol></ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<ol><ol><li>bar</ol></ol>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<ol><ol><li>bar</ol></ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<ol><ol><li>bar</ol></ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<ol><ol><li>bar</ol></ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<ol><ol><li>bar</ol></ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<ol><ol><li>bar</ol></ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<ol><ol><li>bar</ol></ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><ol><li>bar</ol></div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<dl><dt>bar<dd>baz</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<dl><dt>bar<dd>baz</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<dl><dt>bar<dd>baz</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<dl><dt>bar<dd>baz</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<dl><dt>bar<dd>baz</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<dl><dt>bar<dd>baz</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<dl><dt>bar<dd>baz</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<dl><dt>bar<dd>baz</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<dl><dt>bar<dd>baz</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<dl><dd>bar</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<dl><dd>bar</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<dl><dd>bar</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<dl><dd>bar</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<dl><dd>bar</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<dl><dd>bar</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<dl><dd>bar</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<dl><dd>bar</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<dl><dd>bar</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dd>bar</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dd>bar</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dd>bar</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dd>bar</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dd>bar</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dd>bar</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dd>bar</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dd>bar</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dd>bar</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dt>bar<dd>baz</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dt>bar<dd>baz</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dt>bar<dd>baz</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dt>bar<dd>baz</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dt>bar<dd>baz</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dt>bar<dd>baz</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dt>bar<dd>baz</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dt>bar<dd>baz</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[]<dt>bar<dd>baz</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[]<dd>baz</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[]<dd>baz</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[]<dd>baz</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[]<dd>baz</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[]<dd>baz</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[]<dd>baz</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[]<dd>baz</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[]<dd>baz</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[]<dd>baz</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol>bar" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>{}<br></ol>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>bar</li></ol>" but got "<ol><li>bar<br></li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol>bar" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li><li>bar</li></ol>" but got "<ol><li>foo</li><li>bar<br></li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>bar</li></ol>" but got "<ol><li>bar<br></li></ol>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>bar</li></ol>" but got "<ol><li>bar<br></li></ol>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li><li>bar</li></ol>" but got "<ol><li>foo</li><li>bar<br></li></ol>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li><li>bar</li></ol>" but got "<ol><li>foo</li><li>bar<br></li></ol>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol><br>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol><br>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol><br>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol><br>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol><br>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol><br>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]</ol><br>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol><br>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol><br>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol><br>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol><br>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol><br>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol><br>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[]<br></ol><br>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol><br>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol><br>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol><br>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol><br>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol><br>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol><br>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>{}<br></ol><br>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><br>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><br>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><br>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><br>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><br>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><br>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]</ol><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[]<br></ol><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>{}<br></ol><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo<li>{}<br></ol><p><br>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar</blockquote>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar</blockquote>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar</blockquote>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar</blockquote>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote><blockquote>bar</blockquote></blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<blockquote><blockquote>bar</blockquote></blockquote>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<blockquote><blockquote>bar</blockquote></blockquote>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<blockquote><blockquote>bar</blockquote></blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote><blockquote>bar</blockquote></blockquote>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote><blockquote>bar</blockquote></blockquote>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote><blockquote>bar</blockquote></blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote><blockquote>bar</blockquote></blockquote>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote><blockquote>bar</blockquote></blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div>bar</div></blockquote>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<font color=\"#0000ff\">bar</font>" but got "foo<span style=\"color:rgb(0, 0, 255)\">bar</span>"
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\">bar</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><blockquote><p>bar<p>baz</blockquote></blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foobar<blockquote><div><p>baz</p></div></blockquote>" but got "foobar<blockquote><p>baz</p></blockquote>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foobar<blockquote><div><p>baz</p></div></blockquote>" but got "foobar<blockquote><p>baz</p></blockquote>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><div><p>bar<p>baz</div></blockquote>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<font color=\"#0000ff\">bar</font><blockquote style=\"color:rgb(0, 0, 255)\"><p>baz</p></blockquote>" but got "foo<span style=\"color:rgb(0, 0, 255)\">bar</span><blockquote style=\"color:rgb(0, 0, 255)\"><p>baz</p></blockquote>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<font color=\"#0000ff\">bar</font><blockquote style=\"color:rgb(0, 0, 255)\"><p>baz</p></blockquote>" but got "foo<span style=\"color:rgb(0, 0, 255)\">bar</span><blockquote style=\"color:rgb(0, 0, 255)\"><p>baz</p></blockquote>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote style=\"color: blue\"><p>bar<p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><b>bar</b><p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><strong>bar</strong><p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<span>bar</span><blockquote><p>baz</p></blockquote>" but got "foobar<blockquote><p>baz</p></blockquote>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<span>bar</span><blockquote><p>baz</p></blockquote>" but got "foobar<blockquote><p>baz</p></blockquote>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<blockquote><p><span>bar</span><p>baz</blockquote>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote><ol><li>bar</ol></blockquote><p>extra" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<blockquote>bar<ol><li>baz</ol>quz</blockquote><p>extra" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra" compare innerHTML
-PASS [["forwarddelete",""]] "foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<blockquote><ol><li>bar[]</li><ol><li>baz</ol><li>quz</ol></blockquote><p>extra" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span></span>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<span></span>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<span></span>bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<span></span>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span></span>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span></span>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span></span>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span></span>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span></span>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><span></span></span>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<span><span></span></span>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<span><span></span></span>bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<span><span></span></span>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><span></span></span>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><span></span></span>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span><span></span></span>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><span></span></span>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span><span></span></span>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<quasit></quasit>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<quasit></quasit>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<quasit></quasit>bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<quasit></quasit>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<quasit></quasit>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<quasit></quasit>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<quasit></quasit>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<quasit></quasit>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<quasit></quasit>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span></span><br>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<span></span><br>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<span></span><br>bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<span></span><br>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span></span><br>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span></span><br>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span></span><br>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span></span><br>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span></span><br>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo[]<span></span></span>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<span>foo[]<span></span></span>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<span>foo[]<span></span></span>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<span>foo[]<span></span></span>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo[]<span></span></span>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo[]<span></span></span>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<span>foo[]<span></span></span>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo[]<span></span></span>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<span>foo[]<span></span></span>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span></span><span>bar</span>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[]<span></span><span>bar</span>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[]<span></span><span>bar</span>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[]<span></span><span>bar</span>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span></span><span>bar</span>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span></span><span>bar</span>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[]<span></span><span>bar</span>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span></span><span>bar</span>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[]<span></span><span>bar</span>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p>bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><p><!--abc-->bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><div><!--abc--><p>bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<div><!--abc--><div><p>bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<!--abc--><div><div><p>bar</div></div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div><!--abc-->bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div><!--abc-->bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div><!--abc-->bar" compare innerHTML
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div><!--abc-->bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div><!--abc-->bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div><!--abc-->bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div><!--abc-->bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div><!--abc-->bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div></div><!--abc-->bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div><!--abc--></div>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div><!--abc--></div>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div><!--abc--></div>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div><!--abc--></div>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div><!--abc--></div>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div><!--abc--></div>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div><!--abc--></div>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div><!--abc--></div>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</div><!--abc--></div>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></div></div>bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></div></div>bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></div></div>bar" compare innerHTML
-PASS [["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></div></div>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></div></div>bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></div></div>bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></div></div>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></div></div>bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></div></div>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]<!--abc--></p></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p><!--abc--></div></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div><!--abc--></div><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><!--abc--><div><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><!--abc--><div><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><!--abc--><div>bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><div><p>foo[]</p></div></div><div><div><div><!--abc-->bar</div></div></div>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><span style=\"color:rgb(0, 0, 255)\">foo</span>bar</p>" but got "<p style=\"color:rgb(0, 0, 255)\">foobar</p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><font color=\"#0000ff\">foo</font>bar</p>" but got "<p style=\"color:rgb(0, 0, 255)\">foobar</p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><span style=\"color:rgb(0, 0, 255)\">foo</span>bar</p>" but got "<p style=\"color:rgb(0, 0, 255)\">foobar</p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><font color=\"#0000ff\">foo</font>bar</p>" but got "<p style=\"color:rgb(0, 0, 255)\">foobar</p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p style=\"color:rgb(0, 0, 255)\">foo<font color=\"#a52a2a\">bar</font></p>" but got "<p style=\"color:rgb(0, 0, 255)\">foo<span style=\"color:rgb(165, 42, 42)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p style=\"color:rgb(0, 0, 255)\">foo<font color=\"#a52a2a\">bar</font></p>" but got "<p style=\"color:rgb(0, 0, 255)\">foo<span style=\"color:rgb(165, 42, 42)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<font color=\"#a52a2a\">bar</font></p>" but got "<p>foo<span style=\"color:rgb(165, 42, 42)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<font color=\"#a52a2a\">bar</font></p>" but got "<p>foo<span style=\"color:rgb(165, 42, 42)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><font color=\"blue\">foo</font><font color=\"brown\">bar</font></p>" but got "<p><font color=\"blue\">foo</font><span style=\"color:rgb(165, 42, 42)\">bar</span></p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><font color=\"blue\">foo</font><font color=\"brown\">bar</font></p>" but got "<p><font color=\"blue\">foo</font><span style=\"color:rgb(165, 42, 42)\">bar</span></p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><font color=blue>foo[]</font><p><font color=brown>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<font color=\"brown\">bar</font></p>" but got "<p>foo<span style=\"color:rgb(165, 42, 42)\">bar</span></p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<font color=\"brown\">bar</font></p>" but got "<p>foo<span style=\"color:rgb(165, 42, 42)\">bar</span></p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><font color=brown>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=color:blue>foo[]</font><p><span style=color:brown>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=color:brown>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p style=\"background-color:rgb(0, 255, 255)\">foobar</p>" but got "<p style=\"background-color:rgb(0, 255, 255)\">foo<span style=\"background-color:rgb(210, 180, 140)\">bar</span></p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p style=\"background-color:rgb(0, 255, 255)\">foobar</p>" but got "<p style=\"background-color:rgb(0, 255, 255)\">foo<span style=\"background-color:rgb(210, 180, 140)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p style=\"background-color:rgb(0, 255, 255)\">foobar</p>" but got "<p style=\"background-color:rgb(0, 255, 255)\">foo<span style=\"background-color:rgb(210, 180, 140)\">bar</span></p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p style=\"background-color:rgb(0, 255, 255)\">foobar</p>" but got "<p style=\"background-color:rgb(0, 255, 255)\">foo<span style=\"background-color:rgb(210, 180, 140)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=background-color:aqua>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foobar</p>" but got "<p>foo<span style=\"background-color:rgb(210, 180, 140)\">bar</span></p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foobar</p>" but got "<p>foo<span style=\"background-color:rgb(210, 180, 140)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foobar</p>" but got "<p>foo<span style=\"background-color:rgb(210, 180, 140)\">bar</span></p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foobar</p>" but got "<p>foo<span style=\"background-color:rgb(210, 180, 140)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=background-color:tan>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><span style=background-color:aqua>foo[]</font><p><span style=background-color:tan>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><span style=background-color:tan>bar</font>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><span style=\"text-decoration:underline\">foo</span>bar</p>" but got "<p style=\"text-decoration:underline\">foobar</p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><u>foo</u>bar</p>" but got "<p style=\"text-decoration:underline\">foobar</p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><span style=\"text-decoration:underline\">foo</span>bar</p>" but got "<p style=\"text-decoration:underline\">foobar</p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><u>foo</u>bar</p>" but got "<p style=\"text-decoration:underline\">foobar</p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><span style=\"text-decoration:underline\">foo</span><span style=\"text-decoration:line-through\">bar</span></p>" but got "<p style=\"text-decoration:underline\">foo<span style=\"text-decoration-line:line-through\">bar</span></p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><u>foo</u><s>bar</s></p>" but got "<p style=\"text-decoration:underline\">foo<span style=\"text-decoration-line:line-through\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><span style=\"text-decoration:underline\">foo</span><span style=\"text-decoration:line-through\">bar</span></p>" but got "<p style=\"text-decoration:underline\">foo<span style=\"text-decoration-line:line-through\">bar</span></p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><u>foo</u><s>bar</s></p>" but got "<p style=\"text-decoration:underline\">foo<span style=\"text-decoration-line:line-through\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=text-decoration:underline>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<span style=\"text-decoration:line-through\">bar</span></p>" but got "<p>foo<span style=\"text-decoration-line:line-through\">bar</span></p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<s>bar</s></p>" but got "<p>foo<span style=\"text-decoration-line:line-through\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<span style=\"text-decoration:line-through\">bar</span></p>" but got "<p>foo<span style=\"text-decoration-line:line-through\">bar</span></p>"
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<s>bar</s></p>" but got "<p>foo<span style=\"text-decoration-line:line-through\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p style=text-decoration:line-through>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p>bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><u>foo[]</u><p><s>bar</s>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[]<p><s>bar</s>" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><span style=\"color:rgb(0, 0, 255)\">foo</span>bar</p>" but got "<p style=\"color:rgb(0, 0, 255)\">foobar</p>"
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><font color=\"#0000ff\">foo</font>bar</p>" but got "<p style=\"color:rgb(0, 0, 255)\">foobar</p>"
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p style=color:blue>foo[]</p>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<font color=\"#a52a2a\">bar</font>" but got "foo<span style=\"color:rgb(165, 42, 42)\">bar</span>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<font color=\"#a52a2a\">bar</font>" but got "foo<span style=\"color:rgb(165, 42, 42)\">bar</span>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[]<p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<div><p><span style=\"color:rgb(0, 128, 0)\">foo</span>bar</p></div>" but got "<div style=\"color:rgb(0, 0, 255)\"><p style=\"color:rgb(0, 128, 0)\">foobar</p></div>"
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<div><p><font color=\"#008000\">foo</font>bar</p></div>" but got "<div style=\"color:rgb(0, 0, 255)\"><p style=\"color:rgb(0, 128, 0)\">foobar</p></div>"
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<div style=\"color:rgb(0, 0, 255)\"><p style=\"color:rgb(0, 128, 0)\">foo<font color=\"#a52a2a\">bar</font></p></div>" but got "<div style=\"color:rgb(0, 0, 255)\"><p style=\"color:rgb(0, 128, 0)\">foo<span style=\"color:rgb(165, 42, 42)\">bar</span></p></div>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<div style=\"color:rgb(0, 0, 255)\"><p style=\"color:rgb(0, 128, 0)\">foo<font color=\"#a52a2a\">bar</font></p></div>" but got "<div style=\"color:rgb(0, 0, 255)\"><p style=\"color:rgb(0, 128, 0)\">foo<span style=\"color:rgb(165, 42, 42)\">bar</span></p></div>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<div style=color:blue><p style=color:green>foo[]</div><p style=color:brown>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p style=\"color:rgb(0, 0, 255)\">foo<font color=\"#008000\">bar</font></p>" but got "<p style=\"color:rgb(0, 0, 255)\">foo<span style=\"color:rgb(0, 128, 0)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p style=\"color:rgb(0, 0, 255)\">foo<font color=\"#008000\">bar</font></p>" but got "<p style=\"color:rgb(0, 0, 255)\">foo<span style=\"color:rgb(0, 128, 0)\">bar</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p style=color:blue>foo[]<div style=color:brown><p style=color:green>bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[bar]baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[bar]baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[bar]baz" compare innerHTML
-PASS [["forwarddelete",""]] "foo[bar]baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[bar]baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[bar]baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[bar]baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[bar]baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[bar]baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar]</span>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar}</span>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo{<span style=color:#aBcDeF>bar</span>}baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>[foo<span style=color:#aBcDeF>bar]</span>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>{foo<span style=color:#aBcDeF>bar}</span>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span>baz]" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>{bar</span>baz}" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "<p>foo<span style=color:#aBcDeF>[bar</span><span style=color:#fEdCbA>baz]</span>quz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>[bar]</b>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo<b>{bar}</b>baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" compare innerHTML
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" checks for modifications to non-editable content
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" compare innerHTML
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["forwarddelete",""]] "foo{<b>bar</b>}baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<span>[bar]</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo<span>[bar]</span>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo<span>[bar]</span>baz" compare innerHTML
-PASS [["forwarddelete",""]] "foo<span>[bar]</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<span>[bar]</span>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<span>[bar]</span>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<span>[bar]</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<span>[bar]</span>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<span>[bar]</span>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<span>{bar}</span>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo<span>{bar}</span>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo<span>{bar}</span>baz" compare innerHTML
-PASS [["forwarddelete",""]] "foo<span>{bar}</span>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<span>{bar}</span>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<span>{bar}</span>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<span>{bar}</span>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<span>{bar}</span>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<span>{bar}</span>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo{<span>bar</span>}baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo{<span>bar</span>}baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo{<span>bar</span>}baz" compare innerHTML
-PASS [["forwarddelete",""]] "foo{<span>bar</span>}baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo{<span>bar</span>}baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo{<span>bar</span>}baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo{<span>bar</span>}baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo{<span>bar</span>}baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo{<span>bar</span>}baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[bar</b><i>baz]quz</i>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<b>foo[bar</b><i>baz]quz</i>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<b>foo[bar</b><i>baz]quz</i>" compare innerHTML
-PASS [["forwarddelete",""]] "<b>foo[bar</b><i>baz]quz</i>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[bar</b><i>baz]quz</i>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[bar</b><i>baz]quz</i>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>foo[bar</b><i>baz]quz</i>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[bar</b><i>baz]quz</i>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>foo[bar</b><i>baz]quz</i>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo</p><p>[bar]</p><p>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo</p><p>[bar]</p><p>baz</p>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo</p><p>[bar]</p><p>baz</p>" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo</p><p>[bar]</p><p>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo</p><p>[bar]</p><p>baz</p>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo</p><p>[bar]</p><p>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo</p><p>[bar]</p><p>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo</p><p>[bar]</p><p>baz</p>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo</p><p>[bar]</p><p>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar}</p><p>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar}</p><p>baz</p>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar}</p><p>baz</p>" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar}</p><p>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar}</p><p>baz</p>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar}</p><p>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar}</p><p>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar}</p><p>baz</p>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar}</p><p>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar</p>}<p>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar</p>}<p>baz</p>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p>foo</p><p>{bar</p>}<p>baz</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p><p><br></p><p>baz</p>" but got "<p>foo</p><p>baz<br></p>"
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar</p>}<p>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar</p>}<p>baz</p>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar</p>}<p>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar</p>}<p>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar</p>}<p>baz</p>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo</p><p>{bar</p>}<p>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p><br><p>baz</p>" but got "<p>foo</p><p><br></p><p>baz</p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p><br><p>baz</p>" but got "<p>foo</p><p><br></p><p>baz</p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar}</p><p>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p><p>baz</p>" but got "<p>foo</p><p>baz<br></p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p><p>baz</p>" but got "<p>foo</p><p>baz<br></p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo</p>{<p>bar</p>}<p>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<div>baz]quz</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[bar<h1>baz]quz</h1>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[bar<h1>baz]quz</h1>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[bar<h1>baz]quz</h1>" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[bar<h1>baz]quz</h1>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[bar<h1>baz]quz</h1>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[bar<h1>baz]quz</h1>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[bar<h1>baz]quz</h1>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[bar<h1>baz]quz</h1>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[bar<h1>baz]quz</h1>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div>foo[bar</div><p>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<blockquote>foo[bar</blockquote><pre>baz]quz</pre>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<blockquote>foo[bar</blockquote><pre>baz]quz</pre>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<blockquote>foo[bar</blockquote><pre>baz]quz</pre>" compare innerHTML
-PASS [["forwarddelete",""]] "<blockquote>foo[bar</blockquote><pre>baz]quz</pre>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<blockquote>foo[bar</blockquote><pre>baz]quz</pre>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<blockquote>foo[bar</blockquote><pre>baz]quz</pre>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<blockquote>foo[bar</blockquote><pre>baz]quz</pre>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<blockquote>foo[bar</blockquote><pre>baz]quz</pre>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<blockquote>foo[bar</blockquote><pre>baz]quz</pre>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p><b>foo[bar</b><p>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo[bar</div><p>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<blockquote><p>baz]quz<p>qoz</blockquote" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<font color=\"#0000ff\">quz</font></p>" but got "<p>foo<span style=\"color:rgb(0, 0, 255)\">quz</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("stylewithcss", false, "true") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" checks for modifications to non-editable content
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" compare innerHTML
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","true"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("stylewithcss", false, "false") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz": execCommand("forwarddelete", false, "") return value
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" checks for modifications to non-editable content
-FAIL [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<font color=\"#0000ff\">quz</font></p>" but got "<p>foo<span style=\"color:rgb(0, 0, 255)\">quz</span></p>"
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("stylewithcss") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("stylewithcss") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("defaultparagraphseparator") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("defaultparagraphseparator") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("forwarddelete") before
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandIndeterm("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandState("forwarddelete") after
-PASS [["stylewithcss","false"],["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p style=color:blue>baz]quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[bar<p><b>baz]quz</b>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<div><p>foo</p><p><br></p></div>" but got "<p>foo</p><p><br></p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<div><p>foo</p><p><br></p></div>" but got "<p>foo</p><p><br></p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<div><p>foo<p>[bar<p>baz]</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<br>]bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[<br>]bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[<br>]bar" compare innerHTML
-PASS [["forwarddelete",""]] "foo[<br>]bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<br>]bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<br>]bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<br>]bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<br>]bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<br>]bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foobar<br>baz</p>" but got "<p>foobar</p><p>baz</p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foobar<br>baz</p>" but got "<p>foobar</p><p>baz</p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo[</p><p>]bar<br>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>}bar</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<p>]bar<br>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[<p>]bar<br>baz</p>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[<p>]bar<br>baz</p>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[<p>]bar<br>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<p>]bar<br>baz</p>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<p>]bar<br>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<p>]bar<br>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<p>]bar<br>baz</p>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<p>]bar<br>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<p>]bar</p>baz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar</p>}baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<p>{bar</p>}baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo<p>{bar</p>}baz" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "foo<p>{bar</p>}baz" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<p>baz</p>" but got "foo<p>baz<br></p>"
-PASS [["forwarddelete",""]] "foo<p>{bar</p>}baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<p>{bar</p>}baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<p>{bar</p>}baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo<p>{bar</p>}baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<p>{bar</p>}baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo<p>{bar</p>}baz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo{<p>bar}</p>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo{</p>}bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo{</p>}bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo{</p>}bar" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo{</p>}bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo{</p>}bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo{</p>}bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo{</p>}bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo{</p>}bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo{</p>}bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<br>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<br>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<br>baz" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<br>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<br>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<br>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<br>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<br>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<br>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<p>baz</p>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<p>baz</p>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<p>baz</p>" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<p>baz</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<p>baz</p>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<p>baz</p>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<p>baz</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<p>baz</p>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo[</p>]bar<p>baz</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><p>foo[</p></div>]bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div><p>foo[</p></div>]bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div><p>foo[</p></div>]bar" compare innerHTML
-PASS [["forwarddelete",""]] "<div><p>foo[</p></div>]bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><p>foo[</p></div>]bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><p>foo[</p></div>]bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><p>foo[</p></div>]bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><p>foo[</p></div>]bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><p>foo[</p></div>]bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo[<div><p>]bar</p>baz</div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<div>]bar<p>baz</p></div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[<div>]bar<p>baz</p></div>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[<div>]bar<p>baz</p></div>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[<div>]bar<p>baz</p></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<div>]bar<p>baz</p></div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<div>]bar<p>baz</p></div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<div>]bar<p>baz</p></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<div>]bar<p>baz</p></div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<div>]bar<p>baz</p></div>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><p>foo</p>bar[</div>]baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div><p>foo</p>bar[</div>]baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div><p>foo</p>bar[</div>]baz" compare innerHTML
-PASS [["forwarddelete",""]] "<div><p>foo</p>bar[</div>]baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><p>foo</p>bar[</div>]baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><p>foo</p>bar[</div>]baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><p>foo</p>bar[</div>]baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><p>foo</p>bar[</div>]baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><p>foo</p>bar[</div>]baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div>foo<p>bar[</p></div>]baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div>foo<p>bar[</p></div>]baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<div>foo<p>bar[</p></div>]baz" compare innerHTML
-PASS [["forwarddelete",""]] "<div>foo<p>bar[</p></div>]baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div>foo<p>bar[</p></div>]baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div>foo<p>bar[</p></div>]baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div>foo<p>bar[</p></div>]baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div>foo<p>bar[</p></div>]baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div>foo<p>bar[</p></div>]baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<br>{</p>]bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo<br>{</p>]bar" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo<br>{</p>]bar" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo<br>{</p>]bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<br>{</p>]bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<br>{</p>]bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<br>{</p>]bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<br>{</p>]bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<br>{</p>]bar" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<br><br>{</p>]bar": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo<br><br>{</p>]bar" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p>foo<br><br>{</p>]bar" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<br>bar</p>" but got "<p>foo<br>bar<br></p>"
-PASS [["forwarddelete",""]] "<p>foo<br><br>{</p>]bar" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<br><br>{</p>]bar" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<br><br>{</p>]bar" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<br><br>{</p>]bar" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<br><br>{</p>]bar" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<br><br>{</p>]bar" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foobar" but got "foo<br><p>ar</p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foobar" but got "foo<br><p>ar</p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br>{<p>]bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<br>bar" but got "foo<br><br><p>ar</p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "foo<br>bar" but got "foo<br><br><p>ar</p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "foo<br><br>{<p>]bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br>{</p><p>}bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<br>bar</p>" but got "<p>foo<br>bar<br></p>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo<br>bar</p>" but got "<p>foo<br>bar<br></p>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<br><br>{</p><p>}bar</p>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>[bar]<th>baz<tr><td>quz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>ba[r<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<table><tbody><tr><th>fo</th><th><br></th><th>az</th></tr><tr><td>quz</td><td>qoz</td><td>qiz</td></tr></tbody></table>" but got "<table><tbody><tr><th>fo</th><th></th><th>az</th></tr><tr><td>quz</td><td>qoz</td><td>qiz</td></tr></tbody></table>"
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>fo[o<th>bar<th>b]az<tr><td>quz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>" compare innerHTML
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>foo<th>bar<th>ba[z<tr><td>q]uz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<table><tbody><tr><th><br></th><th><br></th><th><br></th></tr><tr><td>quz</td><td>qoz</td><td>qiz</td></tr></tbody></table>" but got "<table><tbody><tr><th><br></th><th></th><th></th></tr><tr><td>quz</td><td>qoz</td><td>qiz</td></tr></tbody></table>"
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz]<tr><td>quz<td>qoz<td>qiz</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<table><tbody><tr><th><br></th><th><br></th><th><br></th></tr><tr><td><br></td><td><br></td><td><br></td></tr></tbody></table>" but got "<br>"
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><th>[foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz]</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}" compare innerHTML
-PASS [["forwarddelete",""]] "{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "{<table><tbody><tr><th>foo<th>bar<th>baz<tr><td>quz<td>qoz<td>qiz</table>}" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<table><tbody><tr><td>foo</td><td>ba</td></tr><tr><td><br></td><td><br></td></tr><tr><td>oz</td><td>qiz</td></tr></tbody></table>" but got "<table><tbody><tr><td>foo</td><td>ba</td></tr><tr><td>oz</td><td>qiz</td></tr></tbody></table>"
-PASS [["forwarddelete",""]] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<table><tbody><tr><td>foo<td>ba[r<tr><td>baz<td>quz<tr><td>q]oz<td>qiz</table>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>fo[o<table><tr><td>b]ar</table><p>baz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>fo[o<table><tr><td>b]ar</table><p>baz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>fo[o<table><tr><td>b]ar</table><p>baz" compare innerHTML
-PASS [["forwarddelete",""]] "<p>fo[o<table><tr><td>b]ar</table><p>baz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>fo[o<table><tr><td>b]ar</table><p>baz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>fo[o<table><tr><td>b]ar</table><p>baz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>fo[o<table><tr><td>b]ar</table><p>baz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>fo[o<table><tr><td>b]ar</table><p>baz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>fo[o<table><tr><td>b]ar</table><p>baz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>ba[r</table><p>b]az": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>ba[r</table><p>b]az" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p>foo<table><tr><td>ba[r</table><p>b]az" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p>foo</p><table><tbody><tr><td>ba</td></tr></tbody></table><p>az</p>" but got "<p>foo</p><table><tbody><tr><td>baaz</td></tr></tbody></table>"
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>ba[r</table><p>b]az" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>ba[r</table><p>b]az" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>ba[r</table><p>b]az" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>ba[r</table><p>b]az" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>ba[r</table><p>b]az" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<table><tr><td>ba[r</table><p>b]az" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<table><tr><td>bar</table><p>b]az" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<ol><li>ba[r<li>b]az</ol><p>quz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo<ol><li>ba[r<li>b]az</ol><p>quz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo<ol><li>ba[r<li>b]az</ol><p>quz" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo<ol><li>ba[r<li>b]az</ol><p>quz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<ol><li>ba[r<li>b]az</ol><p>quz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<ol><li>ba[r<li>b]az</ol><p>quz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<ol><li>ba[r<li>b]az</ol><p>quz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<ol><li>ba[r<li>b]az</ol><p>quz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<ol><li>ba[r<li>b]az</ol><p>quz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<ol><li>bar<li>[baz]</ol><p>quz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>foo<ol><li>bar<li>[baz]</ol><p>quz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>foo<ol><li>bar<li>[baz]</ol><p>quz" compare innerHTML
-PASS [["forwarddelete",""]] "<p>foo<ol><li>bar<li>[baz]</ol><p>quz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<ol><li>bar<li>[baz]</ol><p>quz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<ol><li>bar<li>[baz]</ol><p>quz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>foo<ol><li>bar<li>[baz]</ol><p>quz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<ol><li>bar<li>[baz]</ol><p>quz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>foo<ol><li>bar<li>[baz]</ol><p>quz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz" compare innerHTML
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>b]ar<li>baz</ol><p>quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>foo<ol><li>bar<li>ba[z</ol><p>q]uz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>b]az</ol><p>quz": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>b]az</ol><p>quz" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>b]az</ol><p>quz" compare innerHTML
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>b]az</ol><p>quz" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>b]az</ol><p>quz" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>b]az</ol><p>quz" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>b]az</ol><p>quz" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>b]az</ol><p>quz" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>b]az</ol><p>quz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" compare innerHTML
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" checks for modifications to non-editable content
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" compare innerHTML
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<p>fo[o<ol><li>bar<li>baz</ol><p>q]uz" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ol><li>b]ar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ol><li>b]ar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>fo[o</ol><ol><li>b]ar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foar</li></ol>" but got "<ol><li>fo</li><li>ar</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ol><li>b]ar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ol><li>b]ar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ol><li>b]ar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ol><li>b]ar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ol><li>b]ar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ol><li>b]ar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ul><li>b]ar</ul>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ul><li>b]ar</ul>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ul><li>b]ar</ul>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ul><li>b]ar</ul>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ul><li>b]ar</ul>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ul><li>b]ar</ul>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ul><li>b]ar</ul>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ul><li>b]ar</ul>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>fo[o</ol><ul><li>b]ar</ul>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<ol><li>]bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[<ol><li>]bar</ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[<ol><li>]bar</ol>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[<ol><li>]bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<ol><li>]bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<ol><li>]bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<ol><li>]bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<ol><li>]bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<ol><li>]bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>]bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>]bar</ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>]bar</ol>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>]bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>]bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>]bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>]bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>]bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>]bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<dl><dt>]bar<dd>baz</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[<dl><dt>]bar<dd>baz</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[<dl><dt>]bar<dd>baz</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[<dl><dt>]bar<dd>baz</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<dl><dt>]bar<dd>baz</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<dl><dt>]bar<dd>baz</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<dl><dt>]bar<dd>baz</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<dl><dt>]bar<dd>baz</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<dl><dt>]bar<dd>baz</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<dl><dd>]bar</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "foo[<dl><dd>]bar</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "foo[<dl><dd>]bar</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "foo[<dl><dd>]bar</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<dl><dd>]bar</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<dl><dd>]bar</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "foo[<dl><dd>]bar</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<dl><dd>]bar</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "foo[<dl><dd>]bar</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dd>]bar</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dd>]bar</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dd>]bar</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dd>]bar</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dd>]bar</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dd>]bar</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dd>]bar</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dd>]bar</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dd>]bar</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dt>]bar<dd>baz</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dt>]bar<dd>baz</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dt>]bar<dd>baz</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dt>]bar<dd>baz</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dt>]bar<dd>baz</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dt>]bar<dd>baz</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dt>]bar<dd>baz</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dt>]bar<dd>baz</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo[<dt>]bar<dd>baz</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[<dd>]baz</dl>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[<dd>]baz</dl>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[<dd>]baz</dl>" compare innerHTML
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[<dd>]baz</dl>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[<dd>]baz</dl>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[<dd>]baz</dl>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[<dd>]baz</dl>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[<dd>]baz</dl>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<dl><dt>foo<dd>bar[<dd>]baz</dl>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li></ol>bar" but got "<ol><li>foo</li></ol><ol><li>bar</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li></ol><p>bar</p>" but got "<ol><li>foo</li></ol><ol><li>bar</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li><p>foo</p></li></ol><p>bar</p>" but got "<ol><li><p>foo</p></li></ol><ol><li>bar</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li><p>foo</ol><p>{}<br></p><ol><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol id=\"a\"><li>foo</li></ol>bar" but got "<ol id=\"a\"><li>foo</li></ol><ol><li>bar</li></ol>"
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li></ol>bar" but got "<ol><li>foo</li></ol><ol id=\"b\"><li>bar</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol id=\"a\"><li>foo</li></ol>bar" but got "<ol id=\"a\"><li>foo</li></ol><ol id=\"b\"><li>bar</li></ol>"
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol id=a><li>foo</ol>{}<br><ol id=b><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol class=\"a\"><li>foo</li></ol>bar" but got "<ol class=\"a\"><li>foo</li></ol><ol class=\"b\"><li>bar</li></ol>"
-PASS [["forwarddelete",""]] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol class=a><li>foo</ol>{}<br><ol class=b><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><ol><li>foo</li></ol><li>bar</li></ol>" but got "<ol><ol><li>foo</li></ol><li><ol><li>bar</li></ol></li></ol>"
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br><ol><li>bar</ol></ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><ol><li>foo</li></ol><li>bar</li></ol>" but got "<ol><ol><li>foo</li></ol><ol><li>bar</li></ol></ol>"
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><ol><li>foo</ol><li>{}<br></li><ol><li>bar</ol></ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[</ol>bar]<ol><li>baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[</ol>bar]<ol><li>baz</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo[</ol>bar]<ol><li>baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li><li>baz</li></ol>" but got "<ol><li>foo</li></ol><ol><li>baz</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>foo[</ol>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[</ol>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[</ol>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[</ol>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[</ol>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[</ol>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li><li>baz</li></ol>" but got "<ol><li>foo</li></ol><ol><li>baz</li></ol>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li><li>baz</li></ol>" but got "<ol><li>foo</li></ol><ol><li>baz</li></ol>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li><p>foo</p></li><li>baz</li></ol>" but got "<ol><li><p>foo</p></li></ol><ol><li>baz</li></ol>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li><p>foo</p></li><li>baz</li></ol>" but got "<ol><li><p>foo</p></li></ol><ol><li>baz</li></ol>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li><p>foo[</ol><p>bar]<ol><li>baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>fo[]o</ol><ol><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>fo[]o</ol><ol><li>bar</ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>fo[]o</ol><ol><li>bar</ol>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>fo[]o</ol><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>fo[]o</ol><ol><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>fo[]o</ol><ol><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>fo[]o</ol><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>fo[]o</ol><ol><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>fo[]o</ol><ol><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>[bar<ol><li>]baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>[bar<ol><li>]baz</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo</ol>[bar<ol><li>]baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li></ol>baz" but got "<ol><li>foo</li></ol><ol><li>baz</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>[bar<ol><li>]baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>[bar<ol><li>]baz</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>[bar<ol><li>]baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>[bar<ol><li>]baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>[bar<ol><li>]baz</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>[bar<ol><li>]baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li></ol><p>baz</p>" but got "<ol><li>foo</li></ol><ol><li>baz</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li>]baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>": execCommand("defaultparagraphseparator", false, "div") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li></ol><p>baz</p>" but got "<ol><li>foo</li></ol><ol><li><p>baz</p></li></ol>"
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","div"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>": execCommand("defaultparagraphseparator", false, "p") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" checks for modifications to non-editable content
-FAIL [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li></ol><p>baz</p>" but got "<ol><li>foo</li></ol><ol><li><p>baz</p></li></ol>"
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandIndeterm("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandState("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandValue("defaultparagraphseparator") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandIndeterm("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandState("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandValue("defaultparagraphseparator") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandState("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandValue("forwarddelete") before
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandState("forwarddelete") after
-PASS [["defaultparagraphseparator","p"],["forwarddelete",""]] "<ol><li>foo</ol><p>[bar<ol><li><p>]baz</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><ol><li>[]bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><ol><li>[]bar</ol>" checks for modifications to non-editable content
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><ol><li>[]bar</ol>" compare innerHTML
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><ol><li>[]bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><ol><li>[]bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><ol><li>[]bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><ol><li>[]bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><ol><li>[]bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><ol><li>[]bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><ol><li>foo</li></ol><li>quz</li></ol>" but got "<ol><ol><li>foo</li></ol></ol><ol><li>quz</li></ol>"
-PASS [["forwarddelete",""]] "<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><ol><li>foo[</ol><li>bar</ol>baz]<ol><li>quz</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ul><li>foo</li></ul>bar" but got "<ul><li>foo</li></ul><ul><li>bar</li></ul>"
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ul><li>bar</ul>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ul><li>foo</li></ul><p>bar</p>" but got "<ul><li>foo</li></ul><ul><li>bar</li></ul>"
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ul><li>bar</ul>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li><li>baz</li><li>quz</li></ol>" but got "<ol><li>foo</li></ol><ol><li>baz</li></ol><ol><li>quz</li></ol>"
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo[<li>bar]</ol><ol><li>baz</ol><ol><li>quz</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ul><li>bar</ul>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ul><li>bar</ul>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ul><li>bar</ul>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li></ol>bar" but got "<ol><li>foo</li></ol><ul><li>bar</li></ul>"
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ul><li>bar</ul>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ul><li>bar</ul>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ul><li>bar</ul>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ul><li>bar</ul>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ul><li>bar</ul>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol>{}<br><ul><li>bar</ul>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ol><li>foo</li></ol><p>bar</p>" but got "<ol><li>foo</li></ol><ul><li>bar</li></ul>"
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ol><li>foo</ol><p>{}<br></p><ul><li>bar</ul>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ol><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ol><li>bar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ol><li>bar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ul><li>foo</li></ul>bar" but got "<ul><li>foo</li></ul><ol><li>bar</li></ol>"
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ol><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ol><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ol><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul>{}<br><ol><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<ul><li>foo</li></ul><p>bar</p>" but got "<ul><li>foo</li></ul><ol><li>bar</li></ol>"
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<ul><li>foo</ul><p>{}<br></p><ol><li>bar</ol>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b>[foo]</b>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p><b>[foo]</b>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p><b>[foo]</b>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><b><br></b></p>" but got "<p><br></p>"
-PASS [["forwarddelete",""]] "<p><b>[foo]</b>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b>[foo]</b>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b>[foo]</b>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b>[foo]</b>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b>[foo]</b>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b>[foo]</b>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><quasit>[foo]</quasit>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p><quasit>[foo]</quasit>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p><quasit>[foo]</quasit>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><quasit><br></quasit></p>" but got "<p><br></p>"
-PASS [["forwarddelete",""]] "<p><quasit>[foo]</quasit>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><quasit>[foo]</quasit>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><quasit>[foo]</quasit>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><quasit>[foo]</quasit>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><quasit>[foo]</quasit>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><quasit>[foo]</quasit>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b><i>[foo]</i></b>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p><b><i>[foo]</i></b>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p><b><i>[foo]</i></b>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><b><i><br></i></b></p>" but got "<p><br></p>"
-PASS [["forwarddelete",""]] "<p><b><i>[foo]</i></b>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b><i>[foo]</i></b>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b><i>[foo]</i></b>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b><i>[foo]</i></b>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b><i>[foo]</i></b>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b><i>[foo]</i></b>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b>{foo}</b>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p><b>{foo}</b>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p><b>{foo}</b>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><b><br></b></p>" but got "<p><br></p>"
-PASS [["forwarddelete",""]] "<p><b>{foo}</b>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b>{foo}</b>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b>{foo}</b>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b>{foo}</b>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b>{foo}</b>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b>{foo}</b>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>{<b>foo</b>}": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p>{<b>foo</b>}" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p>{<b>foo</b>}" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><b><br></b></p>" but got "<p><br></p>"
-PASS [["forwarddelete",""]] "<p>{<b>foo</b>}" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>{<b>foo</b>}" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>{<b>foo</b>}" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p>{<b>foo</b>}" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>{<b>foo</b>}" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p>{<b>foo</b>}" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b>[]f</b>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<p><b>[]f</b>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<p><b>[]f</b>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<p><b><br></b></p>" but got "<p><br></p>"
-PASS [["forwarddelete",""]] "<p><b>[]f</b>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b>[]f</b>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b>[]f</b>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<p><b>[]f</b>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b>[]f</b>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<p><b>[]f</b>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>[foo]</b>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<b>[foo]</b>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<b>[foo]</b>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<b><br></b>" but got "<br>"
-PASS [["forwarddelete",""]] "<b>[foo]</b>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>[foo]</b>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>[foo]</b>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<b>[foo]</b>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>[foo]</b>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<b>[foo]</b>" queryCommandValue("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><b>[foo]</b></div>": execCommand("forwarddelete", false, "") return value
-PASS [["forwarddelete",""]] "<div><b>[foo]</b></div>" checks for modifications to non-editable content
-FAIL [["forwarddelete",""]] "<div><b>[foo]</b></div>" compare innerHTMLassert_equals: Unexpected innerHTML (after normalizing inline style) expected "<div><b><br></b></div>" but got "<br>"
-PASS [["forwarddelete",""]] "<div><b>[foo]</b></div>" queryCommandIndeterm("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><b>[foo]</b></div>" queryCommandState("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><b>[foo]</b></div>" queryCommandValue("forwarddelete") before
-PASS [["forwarddelete",""]] "<div><b>[foo]</b></div>" queryCommandIndeterm("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><b>[foo]</b></div>" queryCommandState("forwarddelete") after
-PASS [["forwarddelete",""]] "<div><b>[foo]</b></div>" queryCommandValue("forwarddelete") after
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/resources/gesture-util.js b/third_party/WebKit/LayoutTests/resources/gesture-util.js
index 55bc2d0..e31c716 100644
--- a/third_party/WebKit/LayoutTests/resources/gesture-util.js
+++ b/third_party/WebKit/LayoutTests/resources/gesture-util.js
@@ -27,6 +27,30 @@
   });
 }
 
+function waitForAnimationEnd(getValue, max_frame, max_unchanged_frame) {
+  const MAX_FRAME = max_frame;
+  const MAX_UNCHANGED_FRAME = max_unchanged_frame;
+  var last_changed_frame = 0;
+  var last_position = getValue();
+  return new Promise((resolve, reject) => {
+    function tick(frames) {
+    // We requestAnimationFrame either for MAX_FRAME or until
+    // MAX_UNCHANGED_FRAME with no change have been observed.
+      if (frames >= MAX_FRAME || frames - last_changed_frame > MAX_UNCHANGED_FRAME) {
+        resolve();
+      } else {
+        current_value = getValue();
+        if (last_position != current_value) {
+          last_changed_frame = frames;
+          last_position = current_value;
+        }
+        requestAnimationFrame(tick.bind(this, frames + 1));
+      }
+    }
+    tick(0);
+  })
+}
+
 // Enums for gesture_source_type parameters in gpuBenchmarking synthetic
 // gesture methods. Must match C++ side enums in synthetic_gesture_params.h
 const GestureSourceType = {
@@ -79,6 +103,21 @@
   return 53;
 }
 
+function swipe(pixels_to_scroll, start_x, start_y, direction, speed_in_pixels_s) {
+  return new Promise((resolve, reject) => {
+    if (chrome && chrome.gpuBenchmarking) {
+      chrome.gpuBenchmarking.swipe(direction,
+                                   pixels_to_scroll,
+                                   resolve,
+                                   start_x,
+                                   start_y,
+                                   speed_in_pixels_s);
+    } else {
+      reject('This test requires chrome.gpuBenchmarking');
+    }
+  });
+}
+
 function pinchBy(scale, centerX, centerY, speed_in_pixels_s, gesture_source_type) {
   return new Promise((resolve, reject) => {
     if (chrome && chrome.gpuBenchmarking) {
@@ -176,3 +215,7 @@
     }
   });
 }
+
+function approx_equals(actual, expected, epsilon) {
+  return actual >= expected - epsilon && actual <= expected + epsilon;
+}
\ No newline at end of file
diff --git a/third_party/blink/common/feature_policy/feature_policy.cc b/third_party/blink/common/feature_policy/feature_policy.cc
index 1b4bb63..6c8f16d 100644
--- a/third_party/blink/common/feature_policy/feature_policy.cc
+++ b/third_party/blink/common/feature_policy/feature_policy.cc
@@ -186,9 +186,6 @@
                              const FeatureList& feature_list)
     : origin_(origin), feature_list_(feature_list) {}
 
-FeaturePolicy::FeaturePolicy(url::Origin origin)
-    : origin_(origin), feature_list_(GetDefaultFeatureList()) {}
-
 FeaturePolicy::~FeaturePolicy() = default;
 
 // static
diff --git a/third_party/blink/public/common/feature_policy/feature_policy.h b/third_party/blink/public/common/feature_policy/feature_policy.h
index fa89283a2..249e08c 100644
--- a/third_party/blink/public/common/feature_policy/feature_policy.h
+++ b/third_party/blink/public/common/feature_policy/feature_policy.h
@@ -198,7 +198,6 @@
  private:
   friend class FeaturePolicyTest;
 
-  explicit FeaturePolicy(url::Origin origin);
   FeaturePolicy(url::Origin origin, const FeatureList& feature_list);
   static std::unique_ptr<FeaturePolicy> CreateFromParentPolicy(
       const FeaturePolicy* parent_policy,
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index 26025241..ea54e3d 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -544,8 +544,12 @@
     return nullptr;
   }
 
-  virtual bool IsThreadedCompositingEnabled() { return false; }
-  virtual bool IsThreadedAnimationEnabled() { return true; }
+  // When true, animations will run on a compositor thread independently from
+  // the blink main thread.
+  // This is true when there exists a renderer compositor in this process. But
+  // for unit tests, a single-threaded compositor may be used so it may remain
+  // false.
+  virtual bool IsThreadedAnimationEnabled() { return false; }
 
   // Creates a new fling animation curve instance for device |device_source|
   // with |velocity| and already scrolled |cumulative_scroll| pixels.
diff --git a/third_party/blink/public/platform/web_input_event.h b/third_party/blink/public/platform/web_input_event.h
index c34d26dc..7b26692 100644
--- a/third_party/blink/public/platform/web_input_event.h
+++ b/third_party/blink/public/platform/web_input_event.h
@@ -346,6 +346,17 @@
     return type_ == other.type_;
   }
 
+  bool IsGestureScroll() const {
+    switch (type_) {
+      case Type::kGestureScrollBegin:
+      case Type::kGestureScrollUpdate:
+      case Type::kGestureScrollEnd:
+        return true;
+      default:
+        return false;
+    }
+  }
+
   // Returns true if the WebInputEvent |type| is a pinch gesture event.
   static bool IsPinchGestureEventType(WebInputEvent::Type type) {
     return kGesturePinchTypeFirst <= type && type <= kGesturePinchTypeLast;
diff --git a/third_party/blink/renderer/bindings/core/v8/initialize_v8_extras_binding_test.cc b/third_party/blink/renderer/bindings/core/v8/initialize_v8_extras_binding_test.cc
index 4e845fd..b26ab984 100644
--- a/third_party/blink/renderer/bindings/core/v8/initialize_v8_extras_binding_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/initialize_v8_extras_binding_test.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/initialize_v8_extras_binding.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_extras_test_utils.h"
 #include "third_party/blink/renderer/core/dom/document.h"
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc
index 72eb42e..c9013c9c8 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -367,7 +367,9 @@
     const Animation* animation,
     CompositorAnimation& compositor_animation,
     const EffectModel& effect,
+    Vector<int>& started_keyframe_model_ids,
     double animation_playback_rate) {
+  DCHECK(started_keyframe_model_ids.IsEmpty());
   DCHECK(CheckCanStartAnimationOnCompositor(timing, element, animation, effect,
                                             animation_playback_rate)
              .Ok());
@@ -380,13 +382,18 @@
                            keyframe_effect, keyframe_models,
                            animation_playback_rate);
   DCHECK(!keyframe_models.IsEmpty());
-  for (auto& compositor_keyframe_model : keyframe_models)
+  for (auto& compositor_keyframe_model : keyframe_models) {
+    int id = compositor_keyframe_model->Id();
     compositor_animation.AddKeyframeModel(std::move(compositor_keyframe_model));
+    started_keyframe_model_ids.push_back(id);
+  }
+  DCHECK(!started_keyframe_model_ids.IsEmpty());
 }
 
 void CompositorAnimations::CancelAnimationOnCompositor(
     const Element& element,
-    CompositorAnimation* compositor_animation) {
+    CompositorAnimation* compositor_animation,
+    int id) {
   if (!CheckCanStartElementOnCompositor(element).Ok()) {
     // When an element is being detached, we cancel any associated
     // Animations for CSS animations. But by the time we get
@@ -396,12 +403,13 @@
     return;
   }
   if (compositor_animation)
-    compositor_animation->RemoveKeyframeModels();
+    compositor_animation->RemoveKeyframeModel(id);
 }
 
 void CompositorAnimations::PauseAnimationForTestingOnCompositor(
     const Element& element,
     const Animation& animation,
+    int id,
     double pause_time) {
   // FIXME: CheckCanStartAnimationOnCompositor queries compositingState, which
   // is not necessarily up to date.
@@ -412,7 +420,7 @@
   CompositorAnimation* compositor_animation =
       animation.GetCompositorAnimation();
   DCHECK(compositor_animation);
-  compositor_animation->PauseKeyframeEffect(pause_time);
+  compositor_animation->PauseKeyframeModel(id, pause_time);
 }
 
 void CompositorAnimations::AttachCompositedLayers(
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.h b/third_party/blink/renderer/core/animation/compositor_animations.h
index edfab4b..1739eff 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations.h
+++ b/third_party/blink/renderer/core/animation/compositor_animations.h
@@ -98,10 +98,14 @@
       const Animation*,
       CompositorAnimation&,
       const EffectModel&,
+      Vector<int>& started_keyframe_model_ids,
       double animation_playback_rate);
-  static void CancelAnimationOnCompositor(const Element&, CompositorAnimation*);
+  static void CancelAnimationOnCompositor(const Element&,
+                                          CompositorAnimation*,
+                                          int id);
   static void PauseAnimationForTestingOnCompositor(const Element&,
                                                    const Animation&,
+                                                   int id,
                                                    double pause_time);
 
   static void AttachCompositedLayers(Element&, CompositorAnimation*);
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
index 9237f58..d1fcc00 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -1209,6 +1209,13 @@
                   timing, *element.Get(), animation1, *animation_effect1, 1)
                   .Ok());
 
+  // simulate KeyframeEffect::maybeStartAnimationOnCompositor
+  Vector<int> compositor_keyframe_model_ids;
+  compositor_keyframe_model_ids.push_back(1);
+  keyframe_effect1->SetCompositorKeyframeModelIdsForTesting(
+      compositor_keyframe_model_ids);
+  EXPECT_TRUE(animation1->HasActiveAnimationsOnCompositor());
+
   // The second animation for opacity is not ok to run on compositor.
   KeyframeEffect* keyframe_effect2 =
       KeyframeEffect::Create(element.Get(), animation_effect2, timing);
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.cc b/third_party/blink/renderer/core/animation/keyframe_effect.cc
index 53f86a0..7c6607b 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect.cc
+++ b/third_party/blink/renderer/core/animation/keyframe_effect.cc
@@ -122,8 +122,7 @@
       target_(target),
       model_(model),
       sampled_effect_(nullptr),
-      priority_(priority),
-      has_animation_on_compositor_(false) {
+      priority_(priority) {
   DCHECK(model_);
 }
 
@@ -251,12 +250,13 @@
 
   CompositorAnimations::StartAnimationOnCompositor(
       *target_, group, start_time, current_time, SpecifiedTiming(),
-      GetAnimation(), *compositor_animation, *Model(), animation_playback_rate);
-  has_animation_on_compositor_ = true;
+      GetAnimation(), *compositor_animation, *Model(),
+      compositor_keyframe_model_ids_, animation_playback_rate);
+  DCHECK(!compositor_keyframe_model_ids_.IsEmpty());
 }
 
 bool KeyframeEffect::HasActiveAnimationsOnCompositor() const {
-  return has_animation_on_compositor_;
+  return !compositor_keyframe_model_ids_.IsEmpty();
 }
 
 bool KeyframeEffect::HasActiveAnimationsOnCompositor(
@@ -274,9 +274,12 @@
     return false;
   if (!target_ || !target_->GetLayoutObject())
     return false;
-  CompositorAnimations::CancelAnimationOnCompositor(*target_,
-                                                    compositor_animation);
-  has_animation_on_compositor_ = false;
+  for (const auto& compositor_keyframe_model_id :
+       compositor_keyframe_model_ids_) {
+    CompositorAnimations::CancelAnimationOnCompositor(
+        *target_, compositor_animation, compositor_keyframe_model_id);
+  }
+  compositor_keyframe_model_ids_.clear();
   return true;
 }
 
@@ -292,8 +295,11 @@
   if (!target_ || !target_->GetLayoutObject())
     return;
   DCHECK(GetAnimation());
-  CompositorAnimations::PauseAnimationForTestingOnCompositor(
-      *target_, *GetAnimation(), pause_time);
+  for (const auto& compositor_keyframe_model_id :
+       compositor_keyframe_model_ids_) {
+    CompositorAnimations::PauseAnimationForTestingOnCompositor(
+        *target_, *GetAnimation(), compositor_keyframe_model_id, pause_time);
+  }
 }
 
 void KeyframeEffect::AttachCompositedLayers() {
diff --git a/third_party/blink/renderer/core/animation/keyframe_effect.h b/third_party/blink/renderer/core/animation/keyframe_effect.h
index d937ed7..e068901 100644
--- a/third_party/blink/renderer/core/animation/keyframe_effect.h
+++ b/third_party/blink/renderer/core/animation/keyframe_effect.h
@@ -113,6 +113,11 @@
 
   void AttachCompositedLayers();
 
+  void SetCompositorKeyframeModelIdsForTesting(
+      const Vector<int>& compositor_keyframe_model_ids) {
+    compositor_keyframe_model_ids_ = compositor_keyframe_model_ids;
+  }
+
   void DowngradeToNormal() { priority_ = kDefaultPriority; }
 
   bool HasAnimation() const;
@@ -147,7 +152,7 @@
 
   Priority priority_;
 
-  bool has_animation_on_compositor_;
+  Vector<int> compositor_keyframe_model_ids_;
 };
 
 DEFINE_TYPE_CASTS(KeyframeEffect,
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index cc895507..0ee6e97 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -57,6 +57,7 @@
 #include "third_party/blink/renderer/core/animation/document_animations.h"
 #include "third_party/blink/renderer/core/animation/document_timeline.h"
 #include "third_party/blink/renderer/core/animation/pending_animations.h"
+#include "third_party/blink/renderer/core/animation/worklet_animation_controller.h"
 #include "third_party/blink/renderer/core/css/css_font_selector.h"
 #include "third_party/blink/renderer/core/css/css_property_value_set.h"
 #include "third_party/blink/renderer/core/css/css_style_declaration.h"
@@ -7311,7 +7312,7 @@
   return &GetFrame()->GetInterfaceProvider();
 }
 
-FrameScheduler* Document::GetScheduler() {
+FrameOrWorkerScheduler* Document::GetScheduler() {
   DCHECK(IsMainThread());
 
   if (ContextDocument() && ContextDocument()->GetFrame())
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 9a6687a..9e190d7 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -34,12 +34,9 @@
 #include <utility>
 
 #include "base/memory/scoped_refptr.h"
-#include "base/single_thread_task_runner.h"
 #include "third_party/blink/public/mojom/page/display_cutout.mojom-blink.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
 #include "third_party/blink/public/platform/web_insecure_request_policy.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_value.h"
-#include "third_party/blink/renderer/core/animation/worklet_animation_controller.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/container_node.h"
 #include "third_party/blink/renderer/core/dom/create_element_flags.h"
@@ -51,7 +48,6 @@
 #include "third_party/blink/renderer/core/dom/document_timing.h"
 #include "third_party/blink/renderer/core/dom/frame_request_callback_collection.h"
 #include "third_party/blink/renderer/core/dom/live_node_list_registry.h"
-#include "third_party/blink/renderer/core/dom/mutation_observer.h"
 #include "third_party/blink/renderer/core/dom/scripted_idle_task_controller.h"
 #include "third_party/blink/renderer/core/dom/synchronous_mutation_notifier.h"
 #include "third_party/blink/renderer/core/dom/synchronous_mutation_observer.h"
@@ -65,20 +61,21 @@
 #include "third_party/blink/renderer/core/frame/hosts_using_features.h"
 #include "third_party/blink/renderer/core/html/custom/v0_custom_element.h"
 #include "third_party/blink/renderer/core/html/parser/parser_synchronization_policy.h"
-#include "third_party/blink/renderer/core/page/page_visibility_state.h"
 #include "third_party/blink/renderer/core/page/viewport_description.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h"
 #include "third_party/blink/renderer/platform/length.h"
 #include "third_party/blink/renderer/platform/loader/fetch/client_hints_preferences.h"
-#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
 #include "third_party/blink/renderer/platform/scroll/scroll_types.h"
 #include "third_party/blink/renderer/platform/timer.h"
 #include "third_party/blink/renderer/platform/web_task_runner.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
-#include "third_party/blink/renderer/platform/weborigin/referrer_policy.h"
 #include "third_party/blink/renderer/platform/wtf/hash_set.h"
 
+namespace base {
+class SingleThreadTaskRunner;
+}
+
 namespace ukm {
 class UkmRecorder;
 }  // namespace ukm
@@ -87,6 +84,7 @@
 
 namespace mojom {
 enum class EngagementLevel : int32_t;
+enum class PageVisibilityState : int32_t;
 }  // namespace mojom
 
 class AnimationClock;
@@ -186,6 +184,7 @@
 class V8NodeFilter;
 class VisitedLinkState;
 class WebMouseEvent;
+class WorkletAnimationController;
 struct AnnotatedRegionValue;
 struct FocusParams;
 struct IconURL;
@@ -1390,7 +1389,7 @@
   int64_t UkmSourceID() const;
 
   // May return nullptr.
-  FrameScheduler* GetScheduler() override;
+  FrameOrWorkerScheduler* GetScheduler() override;
 
   scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(TaskType) override;
 
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 8478cfe..cc22f3f1 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -971,9 +971,11 @@
 
     FloatPoint end_point(new_left * box->Style()->EffectiveZoom(),
                          box->ScrollTop().ToFloat());
-    if (SnapCoordinator* coordinator = GetDocument().GetSnapCoordinator()) {
-      end_point =
-          coordinator->GetSnapPositionForPoint(*box, end_point, true, false);
+    if (RuntimeEnabledFeatures::CSSScrollSnapPointsEnabled()) {
+      end_point = GetDocument()
+                      .GetSnapCoordinator()
+                      ->GetSnapPositionForPoint(*box, end_point, true, false)
+                      .value_or(end_point);
     }
     box->SetScrollLeft(LayoutUnit::FromFloatRound(end_point.X()));
   }
@@ -1000,9 +1002,11 @@
 
     FloatPoint end_point(box->ScrollLeft().ToFloat(),
                          new_top * box->Style()->EffectiveZoom());
-    if (SnapCoordinator* coordinator = GetDocument().GetSnapCoordinator()) {
-      end_point =
-          coordinator->GetSnapPositionForPoint(*box, end_point, false, true);
+    if (RuntimeEnabledFeatures::CSSScrollSnapPointsEnabled()) {
+      end_point = GetDocument()
+                      .GetSnapCoordinator()
+                      ->GetSnapPositionForPoint(*box, end_point, false, true)
+                      .value_or(end_point);
     }
     box->SetScrollTop(LayoutUnit::FromFloatRound(end_point.Y()));
   }
@@ -1119,10 +1123,14 @@
         top * box->Style()->EffectiveZoom() + current_scaled_top;
 
     FloatPoint new_scaled_position(new_scaled_left, new_scaled_top);
-    if (SnapCoordinator* coordinator = GetDocument().GetSnapCoordinator()) {
-      new_scaled_position = coordinator->GetSnapPositionForPoint(
-          *box, new_scaled_position, scroll_to_options.hasLeft(),
-          scroll_to_options.hasTop());
+    if (RuntimeEnabledFeatures::CSSScrollSnapPointsEnabled()) {
+      new_scaled_position =
+          GetDocument()
+              .GetSnapCoordinator()
+              ->GetSnapPositionForPoint(*box, new_scaled_position,
+                                        scroll_to_options.hasLeft(),
+                                        scroll_to_options.hasTop())
+              .value_or(new_scaled_position);
     }
     box->ScrollToPosition(new_scaled_position, scroll_behavior);
   }
@@ -1147,10 +1155,14 @@
           box->Style()->EffectiveZoom();
 
     FloatPoint new_scaled_position(scaled_left, scaled_top);
-    if (SnapCoordinator* coordinator = GetDocument().GetSnapCoordinator()) {
-      new_scaled_position = coordinator->GetSnapPositionForPoint(
-          *box, new_scaled_position, scroll_to_options.hasLeft(),
-          scroll_to_options.hasTop());
+    if (RuntimeEnabledFeatures::CSSScrollSnapPointsEnabled()) {
+      new_scaled_position =
+          GetDocument()
+              .GetSnapCoordinator()
+              ->GetSnapPositionForPoint(*box, new_scaled_position,
+                                        scroll_to_options.hasLeft(),
+                                        scroll_to_options.hasTop())
+              .value_or(new_scaled_position);
     }
     box->ScrollToPosition(new_scaled_position, scroll_behavior);
   }
@@ -1189,10 +1201,14 @@
 
   FloatPoint new_scaled_position = viewport->ScrollOffsetToPosition(
       ScrollOffset(new_scaled_left, new_scaled_top));
-  if (SnapCoordinator* coordinator = GetDocument().GetSnapCoordinator()) {
-    new_scaled_position = coordinator->GetSnapPositionForPoint(
-        *GetDocument().GetLayoutView(), new_scaled_position,
-        scroll_to_options.hasLeft(), scroll_to_options.hasTop());
+  if (RuntimeEnabledFeatures::CSSScrollSnapPointsEnabled()) {
+    new_scaled_position =
+        GetDocument()
+            .GetSnapCoordinator()
+            ->GetSnapPositionForPoint(
+                *GetDocument().GetLayoutView(), new_scaled_position,
+                scroll_to_options.hasLeft(), scroll_to_options.hasTop())
+            .value_or(new_scaled_position);
   }
   viewport->SetScrollOffset(
       viewport->ScrollPositionToOffset(new_scaled_position),
@@ -1230,10 +1246,14 @@
 
   FloatPoint new_scaled_position =
       viewport->ScrollOffsetToPosition(ScrollOffset(scaled_left, scaled_top));
-  if (SnapCoordinator* coordinator = GetDocument().GetSnapCoordinator()) {
-    new_scaled_position = coordinator->GetSnapPositionForPoint(
-        *GetDocument().GetLayoutView(), new_scaled_position,
-        scroll_to_options.hasLeft(), scroll_to_options.hasTop());
+  if (RuntimeEnabledFeatures::CSSScrollSnapPointsEnabled()) {
+    new_scaled_position =
+        GetDocument()
+            .GetSnapCoordinator()
+            ->GetSnapPositionForPoint(
+                *GetDocument().GetLayoutView(), new_scaled_position,
+                scroll_to_options.hasLeft(), scroll_to_options.hasTop())
+            .value_or(new_scaled_position);
   }
   viewport->SetScrollOffset(
       viewport->ScrollPositionToOffset(new_scaled_position),
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index beff05c..d873b10 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -3485,7 +3485,7 @@
     // but for various reasons, that's not the case...
     page_->GetSettings().SetAcceleratedCompositingEnabled(layer_tree_view_);
     if (layer_tree_view_) {
-      if (layer_tree_view_->CompositorAnimationHost()) {
+      if (Platform::Current()->IsThreadedAnimationEnabled()) {
         animation_host_ = std::make_unique<CompositorAnimationHost>(
             layer_tree_view_->CompositorAnimationHost());
       }
diff --git a/third_party/blink/renderer/core/frame/dom_timer.cc b/third_party/blink/renderer/core/frame/dom_timer.cc
index 452bc15..e5cf9c6 100644
--- a/third_party/blink/renderer/core/frame/dom_timer.cc
+++ b/third_party/blink/renderer/core/frame/dom_timer.cc
@@ -116,9 +116,10 @@
 }
 
 void DOMTimer::Stop() {
+  const bool is_interval = !RepeatIntervalDelta().is_zero();
   probe::AsyncTaskCanceledBreakable(
-      GetExecutionContext(),
-      RepeatInterval() ? "clearInterval" : "clearTimeout", this);
+      GetExecutionContext(), is_interval ? "clearInterval" : "clearTimeout",
+      this);
 
   user_gesture_token_ = nullptr;
   // Need to release JS objects potentially protected by ScheduledAction
@@ -145,16 +146,14 @@
 
   TRACE_EVENT1("devtools.timeline", "TimerFire", "data",
                InspectorTimerFireEvent::Data(context, timeout_id_));
-  probe::UserCallback probe(context,
-                            RepeatInterval() ? "setInterval" : "setTimeout",
-                            AtomicString(), true);
-  probe::AsyncTask async_task(context, this,
-                              RepeatInterval() ? "fired" : nullptr);
+  const bool is_interval = !RepeatIntervalDelta().is_zero();
+  probe::UserCallback probe(context, is_interval ? "setInterval" : "setTimeout",
+                            g_null_atom, true);
+  probe::AsyncTask async_task(context, this, is_interval ? "fired" : nullptr);
 
   // Simple case for non-one-shot timers.
   if (IsActive()) {
-    if (!RepeatIntervalDelta().is_zero() &&
-        RepeatIntervalDelta() < kMinimumInterval) {
+    if (is_interval && RepeatIntervalDelta() < kMinimumInterval) {
       nesting_level_++;
       if (nesting_level_ >= kMaxTimerNestingLevel)
         AugmentRepeatInterval(kMinimumInterval - RepeatIntervalDelta());
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
index 6091704..7a99530 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -471,6 +471,11 @@
 }
 
 content::RenderWidgetCompositor* RenderWidgetCompositorFactory::Initialize() {
+  return Initialize(/*delegate=*/nullptr);
+}
+
+content::RenderWidgetCompositor* RenderWidgetCompositorFactory::Initialize(
+    content::RenderWidgetCompositorDelegate* specified_delegate) {
   cc::LayerTreeSettings settings;
   // Use synchronous compositing so that the MessageLoop becomes idle and the
   // test makes progress.
@@ -485,7 +490,7 @@
     settings.use_layer_lists = true;
 
   compositor_ = std::make_unique<content::RenderWidgetCompositor>(
-      &delegate_, &compositor_deps_);
+      specified_delegate ? specified_delegate : &delegate_, &compositor_deps_);
   compositor_->Initialize(settings);
   return compositor_.get();
 }
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h
index ddab7b2..d4cd0fa5 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.h
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -165,7 +165,11 @@
 // unit tests.
 class RenderWidgetCompositorFactory {
  public:
+  // Use this to make a RenderWidgetCompositor with a stub delegate.
   content::RenderWidgetCompositor* Initialize();
+  // Use this to specify a delegate instead of using a stub.
+  content::RenderWidgetCompositor* Initialize(
+      content::RenderWidgetCompositorDelegate*);
 
  private:
   content::StubRenderWidgetCompositorDelegate delegate_;
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index 2eceaf8..53a017d 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -1139,10 +1139,14 @@
                             y * GetFrame()->PageZoomFactor());
   FloatPoint new_scaled_position =
       viewport->ScrollOffsetToPosition(scaled_delta + current_offset);
-  if (SnapCoordinator* coordinator = document()->GetSnapCoordinator()) {
-    new_scaled_position = coordinator->GetSnapPositionForPoint(
-        *document()->GetLayoutView(), new_scaled_position,
-        scroll_to_options.hasLeft(), scroll_to_options.hasTop());
+  if (RuntimeEnabledFeatures::CSSScrollSnapPointsEnabled()) {
+    new_scaled_position =
+        document()
+            ->GetSnapCoordinator()
+            ->GetSnapPositionForPoint(
+                *document()->GetLayoutView(), new_scaled_position,
+                scroll_to_options.hasLeft(), scroll_to_options.hasTop())
+            .value_or(new_scaled_position);
   }
 
   ScrollBehavior scroll_behavior = kScrollBehaviorAuto;
@@ -1210,10 +1214,14 @@
 
   FloatPoint new_scaled_position =
       viewport->ScrollOffsetToPosition(ScrollOffset(scaled_x, scaled_y));
-  if (SnapCoordinator* coordinator = document()->GetSnapCoordinator()) {
-    new_scaled_position = coordinator->GetSnapPositionForPoint(
-        *document()->GetLayoutView(), new_scaled_position,
-        scroll_to_options.hasLeft(), scroll_to_options.hasTop());
+  if (RuntimeEnabledFeatures::CSSScrollSnapPointsEnabled()) {
+    new_scaled_position =
+        document()
+            ->GetSnapCoordinator()
+            ->GetSnapPositionForPoint(
+                *document()->GetLayoutView(), new_scaled_position,
+                scroll_to_options.hasLeft(), scroll_to_options.hasTop())
+            .value_or(new_scaled_position);
   }
 
   ScrollBehavior scroll_behavior = kScrollBehaviorAuto;
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index 9fcb0a8..11508d7 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -1431,4 +1431,8 @@
   pause_handle_bindings_.CloseAllBindings();
 }
 
+void LocalFrame::AnimateSnapFling(base::TimeTicks monotonic_time) {
+  GetEventHandler().AnimateSnapFling(monotonic_time);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h
index 6fad623..178e41fe 100644
--- a/third_party/blink/renderer/core/frame/local_frame.h
+++ b/third_party/blink/renderer/core/frame/local_frame.h
@@ -359,6 +359,8 @@
 
   void ResumeSubresourceLoading();
 
+  void AnimateSnapFling(base::TimeTicks monotonic_time);
+
  private:
   friend class FrameNavigationDisabler;
 
diff --git a/third_party/blink/renderer/core/frame/pausable_timer.cc b/third_party/blink/renderer/core/frame/pausable_timer.cc
index 55f66ce..2c5d857 100644
--- a/third_party/blink/renderer/core/frame/pausable_timer.cc
+++ b/third_party/blink/renderer/core/frame/pausable_timer.cc
@@ -31,15 +31,14 @@
 namespace blink {
 
 namespace {
-// The lowest value returned by TimerBase::nextUnalignedFireInterval is 0.0
-const double kNextFireIntervalInvalid = -1.0;
+// TimerBase::NextFireIntervalDelta returns a delta >= 0.
+constexpr TimeDelta kNextFireIntervalInvalid = TimeDelta::Min();
 }  // namespace
 
 PausableTimer::PausableTimer(ExecutionContext* context, TaskType task_type)
     : TimerBase(context->GetTaskRunner(task_type)),
       PausableObject(context),
-      next_fire_interval_(kNextFireIntervalInvalid),
-      repeat_interval_(0) {
+      next_fire_interval_(kNextFireIntervalInvalid) {
   DCHECK(context);
 }
 
@@ -60,9 +59,9 @@
   paused_ = true;
 #endif
   if (IsActive()) {
-    next_fire_interval_ = NextFireInterval();
-    DCHECK_GE(next_fire_interval_, 0.0);
-    repeat_interval_ = RepeatInterval();
+    next_fire_interval_ = NextFireIntervalDelta();
+    DCHECK_GE(next_fire_interval_, TimeDelta());
+    repeat_interval_ = RepeatIntervalDelta();
     TimerBase::Stop();
   }
 }
@@ -72,7 +71,7 @@
   DCHECK(paused_);
   paused_ = false;
 #endif
-  if (next_fire_interval_ >= 0.0) {
+  if (next_fire_interval_ >= TimeDelta()) {
     // start() was called before, therefore location() is already set.
     // m_nextFireInterval is only set in suspend() if the Timer was active.
     Start(next_fire_interval_, repeat_interval_, GetLocation());
diff --git a/third_party/blink/renderer/core/frame/pausable_timer.h b/third_party/blink/renderer/core/frame/pausable_timer.h
index 1f73e43..40cf8b05 100644
--- a/third_party/blink/renderer/core/frame/pausable_timer.h
+++ b/third_party/blink/renderer/core/frame/pausable_timer.h
@@ -48,8 +48,8 @@
  private:
   void Fired() override = 0;
 
-  double next_fire_interval_;
-  double repeat_interval_;
+  TimeDelta next_fire_interval_;
+  TimeDelta repeat_interval_;
 #if DCHECK_IS_ON()
   bool paused_ = false;
 #endif
diff --git a/third_party/blink/renderer/core/frame/root_frame_viewport.h b/third_party/blink/renderer/core/frame/root_frame_viewport.h
index e25a40e..8b80c27 100644
--- a/third_party/blink/renderer/core/frame/root_frame_viewport.h
+++ b/third_party/blink/renderer/core/frame/root_frame_viewport.h
@@ -67,6 +67,11 @@
   LayoutRect VisibleScrollSnapportRect(
       IncludeScrollbarsInRect = kExcludeScrollbars) const override;
   bool ShouldUseIntegerScrollOffset() const override;
+  bool IsThrottled() const override {
+    // RootFrameViewport is always in the main frame, so the frame does not get
+    // throttled.
+    return false;
+  }
   bool IsActive() const override;
   int ScrollSize(ScrollbarOrientation) const override;
   bool IsScrollCornerVisible() const override;
diff --git a/third_party/blink/renderer/core/frame/root_frame_viewport_test.cc b/third_party/blink/renderer/core/frame/root_frame_viewport_test.cc
index 18a95dc..03c37576 100644
--- a/third_party/blink/renderer/core/frame/root_frame_viewport_test.cc
+++ b/third_party/blink/renderer/core/frame/root_frame_viewport_test.cc
@@ -102,6 +102,7 @@
     scroll_offset_ = offset;
   }
   bool ShouldUseIntegerScrollOffset() const override { return true; }
+  bool IsThrottled() const override { return false; }
   bool IsActive() const override { return true; }
   bool IsScrollCornerVisible() const override { return true; }
   IntRect ScrollCornerRect() const override { return IntRect(); }
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.h b/third_party/blink/renderer/core/frame/visual_viewport.h
index 9ef084bba4..09c8a3eb 100644
--- a/third_party/blink/renderer/core/frame/visual_viewport.h
+++ b/third_party/blink/renderer/core/frame/visual_viewport.h
@@ -187,6 +187,11 @@
   void SetScrollOffset(const ScrollOffset&,
                        ScrollType,
                        ScrollBehavior = kScrollBehaviorInstant) override;
+  bool IsThrottled() const override {
+    // VisualViewport is always in the main frame, so the frame does not get
+    // throttled.
+    return false;
+  }
   bool IsActive() const override { return false; }
   int ScrollSize(ScrollbarOrientation) const override;
   bool IsScrollCornerVisible() const override { return false; }
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index 54cf415..b0d8f60 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -38,6 +38,7 @@
 #include "build/build_config.h"
 #include "cc/layers/picture_layer.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom-blink.h"
+#include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_scroll_into_view_params.h"
 #include "third_party/blink/public/web/web_autofill_client.h"
 #include "third_party/blink/public/web/web_element.h"
@@ -1034,7 +1035,7 @@
   DCHECK(!mutator_);
   layer_tree_view_ = Client()->InitializeLayerTreeView();
   DCHECK(layer_tree_view_);
-  if (layer_tree_view_->CompositorAnimationHost()) {
+  if (Platform::Current()->IsThreadedAnimationEnabled()) {
     animation_host_ = std::make_unique<CompositorAnimationHost>(
         layer_tree_view_->CompositorAnimationHost());
   }
diff --git a/third_party/blink/renderer/core/html/html_slot_element.cc b/third_party/blink/renderer/core/html/html_slot_element.cc
index 8351665..aae0b3c 100644
--- a/third_party/blink/renderer/core/html/html_slot_element.cc
+++ b/third_party/blink/renderer/core/html/html_slot_element.cc
@@ -34,6 +34,7 @@
 #include "third_party/blink/renderer/core/css/style_change_reason.h"
 #include "third_party/blink/renderer/core/css/style_engine.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
+#include "third_party/blink/renderer/core/dom/mutation_observer.h"
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
 #include "third_party/blink/renderer/core/dom/node_traversal.h"
 #include "third_party/blink/renderer/core/dom/shadow_root.h"
diff --git a/third_party/blink/renderer/core/html/track/text_track_container.cc b/third_party/blink/renderer/core/html/track/text_track_container.cc
index e73511b4..2b39733f 100644
--- a/third_party/blink/renderer/core/html/track/text_track_container.cc
+++ b/third_party/blink/renderer/core/html/track/text_track_container.cc
@@ -85,6 +85,11 @@
 }
 
 LayoutObject* TextTrackContainer::CreateLayoutObject(const ComputedStyle&) {
+  // TODO(mstensho): Should use LayoutObjectFactory to create the right type of
+  // object here, to enable LayoutNG, but currently we can't, because this will
+  // typically be a child of LayoutVideo (a legacy type), and we'll typically
+  // also insert a LayoutVTTCue (a LayoutBlockFlow type) child, which also isn't
+  // implemented in NG.
   return new LayoutBlockFlow(this);
 }
 
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc
index bd07a2ac..e380f58 100644
--- a/third_party/blink/renderer/core/input/event_handler.cc
+++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -1215,6 +1215,10 @@
   should_only_fire_drag_over_event_ = false;
 }
 
+void EventHandler::AnimateSnapFling(base::TimeTicks monotonic_time) {
+  scroll_manager_->AnimateSnapFling(monotonic_time);
+}
+
 void EventHandler::SetCapturingMouseEventsNode(Node* n) {
   capturing_mouse_events_node_ = n;
   event_handler_will_reset_capturing_mouse_events_node_ = false;
diff --git a/third_party/blink/renderer/core/input/event_handler.h b/third_party/blink/renderer/core/input/event_handler.h
index 99affe7..48f11d9 100644
--- a/third_party/blink/renderer/core/input/event_handler.h
+++ b/third_party/blink/renderer/core/input/event_handler.h
@@ -272,6 +272,8 @@
     return *event_handler_registry_;
   }
 
+  void AnimateSnapFling(base::TimeTicks monotonic_time);
+
  private:
   enum NoCursorChangeType { kNoCursorChange };
 
diff --git a/third_party/blink/renderer/core/input/scroll_manager.cc b/third_party/blink/renderer/core/input/scroll_manager.cc
index 896ab91..f52001f 100644
--- a/third_party/blink/renderer/core/input/scroll_manager.cc
+++ b/third_party/blink/renderer/core/input/scroll_manager.cc
@@ -17,6 +17,7 @@
 #include "third_party/blink/renderer/core/layout/layout_embedded_content.h"
 #include "third_party/blink/renderer/core/layout/layout_view.h"
 #include "third_party/blink/renderer/core/page/autoscroll_controller.h"
+#include "third_party/blink/renderer/core/page/chrome_client.h"
 #include "third_party/blink/renderer/core/page/page.h"
 #include "third_party/blink/renderer/core/page/scrolling/overscroll_controller.h"
 #include "third_party/blink/renderer/core/page/scrolling/root_scroller_controller.h"
@@ -30,8 +31,38 @@
 #include "third_party/blink/renderer/platform/scroll/scroll_customization.h"
 
 namespace blink {
+namespace {
+
+SnapFlingController::GestureScrollType ToGestureScrollType(
+    WebInputEvent::Type web_event_type) {
+  switch (web_event_type) {
+    case WebInputEvent::kGestureScrollBegin:
+      return SnapFlingController::GestureScrollType::kBegin;
+    case WebInputEvent::kGestureScrollUpdate:
+      return SnapFlingController::GestureScrollType::kUpdate;
+    case WebInputEvent::kGestureScrollEnd:
+      return SnapFlingController::GestureScrollType::kEnd;
+    default:
+      NOTREACHED();
+      return SnapFlingController::GestureScrollType::kBegin;
+  }
+}
+
+SnapFlingController::GestureScrollUpdateInfo GetGestureScrollUpdateInfo(
+    const WebGestureEvent& event) {
+  return {.delta = gfx::Vector2dF(-event.data.scroll_update.delta_x,
+                                  -event.data.scroll_update.delta_y),
+          .is_in_inertial_phase = event.data.scroll_update.inertial_phase ==
+                                  WebGestureEvent::kMomentumPhase,
+          .event_time = event.TimeStamp()};
+}
+
+}  // namespace
 
 ScrollManager::ScrollManager(LocalFrame& frame) : frame_(frame) {
+  if (RuntimeEnabledFeatures::CSSScrollSnapPointsEnabled())
+    snap_fling_controller_ = std::make_unique<cc::SnapFlingController>(this);
+
   Clear();
 }
 
@@ -456,6 +487,12 @@
       return WebInputEventResult::kNotHandled;
     }
   }
+  if (snap_fling_controller_) {
+    if (snap_fling_controller_->HandleGestureScrollUpdate(
+            GetGestureScrollUpdateInfo(gesture_event))) {
+      return WebInputEventResult::kHandledSystem;
+    }
+  }
 
   // Negate the deltas since the gesture event stores finger movement and
   // scrolling occurs in the direction opposite the finger's movement
@@ -538,25 +575,6 @@
   return WebInputEventResult::kNotHandled;
 }
 
-void ScrollManager::SnapAtGestureScrollEnd() {
-  if (!previous_gesture_scrolled_element_)
-    return;
-  SnapCoordinator* snap_coordinator =
-      frame_->GetDocument()->GetSnapCoordinator();
-  Element* document_element = frame_->GetDocument()->documentElement();
-  LayoutBox* layout_box =
-      previous_gesture_scrolled_element_ == document_element
-          ? frame_->GetDocument()->GetLayoutView()
-          : previous_gesture_scrolled_element_->GetLayoutBox();
-  if (!snap_coordinator || !layout_box || !layout_box->GetScrollableArea() ||
-      (!did_scroll_x_for_scroll_gesture_ && !did_scroll_y_for_scroll_gesture_))
-    return;
-
-  snap_coordinator->PerformSnapping(*layout_box,
-                                    did_scroll_x_for_scroll_gesture_,
-                                    did_scroll_y_for_scroll_gesture_);
-}
-
 WebInputEventResult ScrollManager::HandleGestureScrollEnd(
     const WebGestureEvent& gesture_event) {
   TRACE_EVENT0("input", "ScrollManager::handleGestureScrollEnd");
@@ -589,6 +607,101 @@
   return WebInputEventResult::kNotHandled;
 }
 
+LayoutBox* ScrollManager::LayoutBoxForSnapping() const {
+  Element* document_element = frame_->GetDocument()->documentElement();
+  return previous_gesture_scrolled_element_ == document_element
+             ? frame_->GetDocument()->GetLayoutView()
+             : previous_gesture_scrolled_element_->GetLayoutBox();
+}
+
+ScrollableArea* ScrollManager::ScrollableAreaForSnapping() const {
+  Element* document_element = frame_->GetDocument()->documentElement();
+  return previous_gesture_scrolled_element_ == document_element
+             ? frame_->View()->GetScrollableArea()
+             : previous_gesture_scrolled_element_->GetLayoutBox()
+                   ->GetScrollableArea();
+}
+
+void ScrollManager::SnapAtGestureScrollEnd() {
+  if (!previous_gesture_scrolled_element_ ||
+      (!did_scroll_x_for_scroll_gesture_ && !did_scroll_y_for_scroll_gesture_))
+    return;
+  SnapCoordinator* snap_coordinator =
+      frame_->GetDocument()->GetSnapCoordinator();
+  if (!snap_coordinator)
+    return;
+
+  LayoutBox* layout_box = LayoutBoxForSnapping();
+  snap_coordinator->PerformSnapping(*layout_box,
+                                    did_scroll_x_for_scroll_gesture_,
+                                    did_scroll_y_for_scroll_gesture_);
+}
+
+bool ScrollManager::GetSnapFlingInfo(const gfx::Vector2dF& natural_displacement,
+                                     gfx::Vector2dF* out_initial_offset,
+                                     gfx::Vector2dF* out_target_offset) const {
+  if (!previous_gesture_scrolled_element_)
+    return false;
+
+  SnapCoordinator* snap_coordinator =
+      frame_->GetDocument()->GetSnapCoordinator();
+  LayoutBox* layout_box = LayoutBoxForSnapping();
+  if (!snap_coordinator || !layout_box || !layout_box->GetScrollableArea())
+    return false;
+  return snap_coordinator->GetSnapFlingInfo(
+      *layout_box, natural_displacement, out_initial_offset, out_target_offset);
+}
+
+gfx::Vector2dF ScrollManager::ScrollByForSnapFling(
+    const gfx::Vector2dF& delta) {
+  DCHECK(previous_gesture_scrolled_element_);
+  std::unique_ptr<ScrollStateData> scroll_state_data =
+      std::make_unique<ScrollStateData>();
+
+  // TODO(sunyunjia): Plumb the velocity of the snap curve as well.
+  scroll_state_data->delta_x = delta.x();
+  scroll_state_data->delta_y = delta.y();
+  scroll_state_data->is_in_inertial_phase = true;
+  scroll_state_data->from_user_input = true;
+  scroll_state_data->delta_granularity =
+      static_cast<double>(ScrollGranularity::kScrollByPrecisePixel);
+  scroll_state_data->delta_consumed_for_scroll_sequence =
+      delta_consumed_for_scroll_sequence_;
+  ScrollState* scroll_state = ScrollState::Create(std::move(scroll_state_data));
+  scroll_state->SetCurrentNativeScrollingElement(
+      previous_gesture_scrolled_element_);
+
+  CustomizedScroll(*scroll_state);
+
+  ScrollableArea* scrollable_area = ScrollableAreaForSnapping();
+  FloatPoint end_position = scrollable_area->ScrollPosition();
+  return gfx::Vector2dF(end_position.X(), end_position.Y());
+}
+
+void ScrollManager::ScrollEndForSnapFling() {
+  std::unique_ptr<ScrollStateData> scroll_state_data =
+      std::make_unique<ScrollStateData>();
+  scroll_state_data->is_ending = true;
+  scroll_state_data->is_in_inertial_phase = true;
+  scroll_state_data->from_user_input = true;
+  scroll_state_data->delta_consumed_for_scroll_sequence =
+      delta_consumed_for_scroll_sequence_;
+  ScrollState* scroll_state = ScrollState::Create(std::move(scroll_state_data));
+  CustomizedScroll(*scroll_state);
+  NotifyScrollPhaseEndForCustomizedScroll();
+  ClearGestureScrollState();
+}
+
+void ScrollManager::RequestAnimationForSnapFling() {
+  if (Page* page = frame_->GetPage())
+    page->GetChromeClient().ScheduleAnimation(frame_->View());
+}
+
+void ScrollManager::AnimateSnapFling(base::TimeTicks monotonic_time) {
+  DCHECK(snap_fling_controller_);
+  snap_fling_controller_->Animate(monotonic_time);
+}
+
 Page* ScrollManager::GetPage() const {
   return frame_->GetPage();
 }
@@ -697,6 +810,13 @@
     }
   }
 
+  if (snap_fling_controller_) {
+    if (gesture_event.IsGestureScroll() &&
+        (snap_fling_controller_->FilterEventForSnap(
+            ToGestureScrollType(gesture_event.GetType())))) {
+      return WebInputEventResult::kNotHandled;
+    }
+  }
   switch (gesture_event.GetType()) {
     case WebInputEvent::kGestureScrollBegin:
       return HandleGestureScrollBegin(gesture_event);
diff --git a/third_party/blink/renderer/core/input/scroll_manager.h b/third_party/blink/renderer/core/input/scroll_manager.h
index 3849f498..72f0136 100644
--- a/third_party/blink/renderer/core/input/scroll_manager.h
+++ b/third_party/blink/renderer/core/input/scroll_manager.h
@@ -14,6 +14,7 @@
 #include "third_party/blink/renderer/platform/geometry/layout_size.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/heap/visitor.h"
+#include "third_party/blink/renderer/platform/scroll/scroll_snap_data.h"
 #include "third_party/blink/renderer/platform/scroll/scroll_types.h"
 #include "third_party/blink/renderer/platform/wtf/allocator.h"
 
@@ -26,6 +27,7 @@
 class PaintLayer;
 class PaintLayerScrollableArea;
 class Page;
+class ScrollableArea;
 class Scrollbar;
 class ScrollState;
 class WebGestureEvent;
@@ -34,9 +36,11 @@
 // user action that causes scrolling or resizing is determined in other *Manager
 // classes and they call into this class for doing the work.
 class CORE_EXPORT ScrollManager
-    : public GarbageCollectedFinalized<ScrollManager> {
+    : public GarbageCollectedFinalized<ScrollManager>,
+      public SnapFlingClient {
  public:
   explicit ScrollManager(LocalFrame&);
+  virtual ~ScrollManager() = default;
   void Trace(blink::Visitor*);
 
   void Clear();
@@ -90,6 +94,16 @@
   void ClearResizeScrollableArea(bool should_not_be_null);
   void SetResizeScrollableArea(PaintLayer*, IntPoint);
 
+  // SnapFlingClient implementation.
+  bool GetSnapFlingInfo(const gfx::Vector2dF& natural_displacement,
+                        gfx::Vector2dF* out_initial_offset,
+                        gfx::Vector2dF* out_target_offset) const override;
+  gfx::Vector2dF ScrollByForSnapFling(const gfx::Vector2dF& delta) override;
+  void ScrollEndForSnapFling() override;
+  void RequestAnimationForSnapFling() override;
+
+  void AnimateSnapFling(base::TimeTicks monotonic_time);
+
  private:
   WebInputEventResult HandleGestureScrollUpdate(const WebGestureEvent&);
   WebInputEventResult HandleGestureScrollBegin(const WebGestureEvent&);
@@ -125,6 +139,9 @@
   void NotifyScrollPhaseBeginForCustomizedScroll(const ScrollState&);
   void NotifyScrollPhaseEndForCustomizedScroll();
 
+  LayoutBox* LayoutBoxForSnapping() const;
+  ScrollableArea* ScrollableAreaForSnapping() const;
+
   // NOTE: If adding a new field to this class please ensure that it is
   // cleared in |ScrollManager::clear()|.
 
@@ -159,6 +176,8 @@
 
   Member<PaintLayerScrollableArea> resize_scrollable_area_;
 
+  std::unique_ptr<SnapFlingController> snap_fling_controller_;
+
   LayoutSize
       offset_from_resize_corner_;  // In the coords of m_resizeScrollableArea.
 
diff --git a/third_party/blink/renderer/core/input/scroll_snap_test.cc b/third_party/blink/renderer/core/input/scroll_snap_test.cc
index 2b7f3f2..e0b7f9c 100644
--- a/third_party/blink/renderer/core/input/scroll_snap_test.cc
+++ b/third_party/blink/renderer/core/input/scroll_snap_test.cc
@@ -21,8 +21,12 @@
   // the pointer/finger's location on touch screen.
   void GestureScroll(double x, double y, double delta_x, double delta_y);
   void ScrollBegin(double x, double y, double hint_x, double hint_y);
-  void ScrollUpdate(double x, double y, double delta_x, double delta_y);
-  void ScrollEnd(double x, double y);
+  void ScrollUpdate(double x,
+                    double y,
+                    double delta_x,
+                    double delta_y,
+                    bool is_in_inertial_phase = false);
+  void ScrollEnd(double x, double y, bool is_in_inertial_phase = false);
   void SetInitialScrollOffset(double x, double y);
 };
 
@@ -99,7 +103,8 @@
 void ScrollSnapTest::ScrollUpdate(double x,
                                   double y,
                                   double delta_x,
-                                  double delta_y) {
+                                  double delta_y,
+                                  bool is_in_inertial_phase) {
   WebGestureEvent event(WebInputEvent::kGestureScrollUpdate,
                         WebInputEvent::kNoModifiers, CurrentTimeTicks(),
                         WebGestureDevice::kWebGestureDeviceTouchscreen);
@@ -107,16 +112,23 @@
   event.SetPositionInScreen(WebFloatPoint(x, y));
   event.data.scroll_update.delta_x = delta_x;
   event.data.scroll_update.delta_y = delta_y;
+  if (is_in_inertial_phase) {
+    event.data.scroll_update.inertial_phase = WebGestureEvent::kMomentumPhase;
+    event.SetTimeStamp(base::TimeTicks());
+  }
   event.SetFrameScale(1);
   GetDocument().GetFrame()->GetEventHandler().HandleGestureScrollEvent(event);
 }
 
-void ScrollSnapTest::ScrollEnd(double x, double y) {
+void ScrollSnapTest::ScrollEnd(double x, double y, bool is_in_inertial_phase) {
   WebGestureEvent event(WebInputEvent::kGestureScrollEnd,
                         WebInputEvent::kNoModifiers, CurrentTimeTicks(),
                         WebGestureDevice::kWebGestureDeviceTouchscreen);
   event.SetPositionInWidget(WebFloatPoint(x, y));
   event.SetPositionInScreen(WebFloatPoint(x, y));
+  event.data.scroll_end.inertial_phase =
+      is_in_inertial_phase ? WebGestureEvent::kMomentumPhase
+                           : WebGestureEvent::kNonMomentumPhase;
   GetDocument().GetFrame()->GetEventHandler().HandleGestureScrollEvent(event);
 }
 
@@ -163,6 +175,33 @@
   ASSERT_EQ(scroller->scrollTop(), 200);
 }
 
+TEST_F(ScrollSnapTest, AnimateFlingToArriveAtSnapPoint) {
+  SetUpForDiv();
+  // Vertically align with the area.
+  SetInitialScrollOffset(0, 200);
+  Element* scroller = GetDocument().getElementById("scroller");
+  ASSERT_EQ(scroller->scrollLeft(), 0);
+  ASSERT_EQ(scroller->scrollTop(), 200);
+
+  ScrollBegin(100, 100, -5, 0);
+  // Starts with a non-inertial GSU.
+  ScrollUpdate(100, 100, -5, 0);
+  // Fling with an inertial GSU.
+  ScrollUpdate(95, 100, -5, 0, true);
+  ScrollEnd(90, 100);
+  Compositor().BeginFrame();
+  // Animate halfway through the fling.
+  Compositor().BeginFrame(0.2);
+  ASSERT_GT(scroller->scrollLeft(), 150);
+  ASSERT_LT(scroller->scrollLeft(), 180);
+  ASSERT_EQ(scroller->scrollTop(), 200);
+  // Finish the animation.
+  Compositor().BeginFrame(0.6);
+
+  ASSERT_EQ(scroller->scrollLeft(), 200);
+  ASSERT_EQ(scroller->scrollTop(), 200);
+}
+
 TEST_F(ScrollSnapTest, SnapWhenBodyViewportDefining) {
   v8::HandleScope HandleScope(v8::Isolate::GetCurrent());
   WebView().Resize(WebSize(300, 300));
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
index 96d18a5..be9e163 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -229,7 +229,7 @@
     }
 
     MinMaxSizeInput child_input;
-    if (!child.CreatesNewFormattingContext())
+    if (child.IsInline() || child.IsAnonymous())
       child_input = {float_left_inline_size, float_right_inline_size};
 
     MinMaxSize child_sizes;
diff --git a/third_party/blink/renderer/core/page/page_animator.cc b/third_party/blink/renderer/core/page/page_animator.cc
index 7b3fedded..3096104 100644
--- a/third_party/blink/renderer/core/page/page_animator.cc
+++ b/third_party/blink/renderer/core/page/page_animator.cc
@@ -72,6 +72,7 @@
               monotonic_animation_start_time.since_origin().InSecondsF());
         }
       }
+      document->GetFrame()->AnimateSnapFling(monotonic_animation_start_time);
       SVGDocumentExtensions::ServiceOnAnimationFrame(*document);
     }
     // TODO(skyostil): This function should not run for documents without views.
diff --git a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
index ac3ac5c0..f7902415 100644
--- a/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
+++ b/third_party/blink/renderer/core/page/scrolling/scrolling_coordinator.cc
@@ -1006,13 +1006,11 @@
 void ScrollingCoordinator::LayerTreeViewInitialized(
     WebLayerTreeView& layer_tree_view,
     LocalFrameView* view) {
-  if (Platform::Current()->IsThreadedAnimationEnabled() &&
-      layer_tree_view.CompositorAnimationHost()) {
+  if (Platform::Current()->IsThreadedAnimationEnabled()) {
     std::unique_ptr<CompositorAnimationTimeline> timeline =
         CompositorAnimationTimeline::Create();
-    std::unique_ptr<CompositorAnimationHost> host =
-        std::make_unique<CompositorAnimationHost>(
-            layer_tree_view.CompositorAnimationHost());
+    auto host = std::make_unique<CompositorAnimationHost>(
+        layer_tree_view.CompositorAnimationHost());
     if (view && view->GetFrame().LocalFrameRoot() != page_->MainFrame()) {
       view->GetScrollingContext()->SetAnimationHost(std::move(host));
       view->GetScrollingContext()->SetAnimationTimeline(std::move(timeline));
diff --git a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc
index 33fcee6..83ca617 100644
--- a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc
+++ b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.cc
@@ -235,25 +235,26 @@
   return snap_area_data;
 }
 
-FloatPoint SnapCoordinator::GetSnapPositionForPoint(
+base::Optional<FloatPoint> SnapCoordinator::GetSnapPositionForPoint(
     const LayoutBox& snap_container,
     const FloatPoint& point,
     bool did_scroll_x,
     bool did_scroll_y) {
   auto iter = snap_container_map_.find(&snap_container);
   if (iter == snap_container_map_.end())
-    return point;
+    return base::nullopt;
 
   const SnapContainerData& data = iter->value;
   if (!data.size())
-    return point;
+    return base::nullopt;
 
   gfx::ScrollOffset snap_position;
   if (data.FindSnapPosition(gfx::ScrollOffset(point.X(), point.Y()),
                             did_scroll_x, did_scroll_y, &snap_position)) {
-    return FloatPoint(snap_position.x(), snap_position.y());
+    FloatPoint snap_point(snap_position.x(), snap_position.y());
+    return snap_point;
   }
-  return point;
+  return base::nullopt;
 }
 
 void SnapCoordinator::PerformSnapping(const LayoutBox& snap_container,
@@ -264,12 +265,14 @@
     return;
 
   FloatPoint current_position = scrollable_area->ScrollPosition();
-  FloatPoint snap_position = GetSnapPositionForPoint(
+  base::Optional<FloatPoint> snap_point = GetSnapPositionForPoint(
       snap_container, current_position, did_scroll_x, did_scroll_y);
+  if (!snap_point.has_value())
+    return;
 
-  if (snap_position != current_position) {
+  if (snap_point.value() != current_position) {
     scrollable_area->SetScrollOffset(
-        scrollable_area->ScrollPositionToOffset(snap_position),
+        scrollable_area->ScrollPositionToOffset(snap_point.value()),
         kProgrammaticScroll, kScrollBehaviorSmooth);
   }
 }
@@ -302,6 +305,30 @@
   return base::nullopt;
 }
 
+bool SnapCoordinator::GetSnapFlingInfo(
+    const LayoutBox& snap_container,
+    const gfx::Vector2dF& natural_displacement,
+    gfx::Vector2dF* out_initial_offset,
+    gfx::Vector2dF* out_target_offset) {
+  ScrollableArea* scrollable_area = ScrollableAreaForSnapping(snap_container);
+  if (!scrollable_area)
+    return false;
+
+  FloatPoint current_position = scrollable_area->ScrollPosition();
+  *out_initial_offset = gfx::Vector2dF(current_position);
+  FloatPoint original_end =
+      current_position +
+      FloatPoint(natural_displacement.x(), natural_displacement.y());
+  bool did_scroll_x = natural_displacement.x() != 0;
+  bool did_scroll_y = natural_displacement.y() != 0;
+  base::Optional<FloatPoint> snap_end = GetSnapPositionForPoint(
+      snap_container, original_end, did_scroll_x, did_scroll_y);
+  if (!snap_end.has_value())
+    return false;
+  *out_target_offset = gfx::Vector2dF(snap_end.value());
+  return true;
+}
+
 #ifndef NDEBUG
 
 void SnapCoordinator::ShowSnapAreaMap() {
diff --git a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
index d21599a..2c3ad76 100644
--- a/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
+++ b/third_party/blink/renderer/core/page/scrolling/snap_coordinator.h
@@ -57,10 +57,15 @@
   void PerformSnapping(const LayoutBox& snap_container,
                        bool did_scroll_x,
                        bool did_scroll_y);
-  FloatPoint GetSnapPositionForPoint(const LayoutBox& snap_container,
-                                     const FloatPoint& natural_position,
-                                     bool did_scroll_x,
-                                     bool did_scroll_y);
+  base::Optional<FloatPoint> GetSnapPositionForPoint(
+      const LayoutBox& snap_container,
+      const FloatPoint& natural_position,
+      bool did_scroll_x,
+      bool did_scroll_y);
+  bool GetSnapFlingInfo(const LayoutBox& snap_container,
+                        const gfx::Vector2dF& natural_displacement,
+                        gfx::Vector2dF* out_initial_offset,
+                        gfx::Vector2dF* out_target_offset);
 
 #ifndef NDEBUG
   void ShowSnapAreaMap();
diff --git a/third_party/blink/renderer/core/page/scrolling/snap_coordinator_test.cc b/third_party/blink/renderer/core/page/scrolling/snap_coordinator_test.cc
index 4fc0260..119f7ba3 100644
--- a/third_party/blink/renderer/core/page/scrolling/snap_coordinator_test.cc
+++ b/third_party/blink/renderer/core/page/scrolling/snap_coordinator_test.cc
@@ -642,10 +642,12 @@
 
   SnapCoordinator* snap_coordinator = GetDocument().GetSnapCoordinator();
   LayoutBox* snap_container = scroller_element->GetLayoutBox();
-  FloatPoint snap_position = snap_coordinator->GetSnapPositionForPoint(
-      *snap_container, FloatPoint(150, 150), true, false);
-  EXPECT_EQ(200 - 8 - 10, snap_position.X());
-  EXPECT_EQ(150, snap_position.Y());
+  base::Optional<FloatPoint> snap_position =
+      snap_coordinator->GetSnapPositionForPoint(
+          *snap_container, FloatPoint(150, 150), true, false);
+  EXPECT_TRUE(snap_position.has_value());
+  EXPECT_EQ(200 - 8 - 10, snap_position.value().X());
+  EXPECT_EQ(150, snap_position.value().Y());
 }
 
 TEST_F(SnapCoordinatorTest, DoesNotSnapOnNonSnappingAxis) {
@@ -658,10 +660,10 @@
 
   SnapCoordinator* snap_coordinator = GetDocument().GetSnapCoordinator();
   LayoutBox* snap_container = scroller_element->GetLayoutBox();
-  FloatPoint snap_position = snap_coordinator->GetSnapPositionForPoint(
-      *snap_container, FloatPoint(150, 150), true, false);
-  EXPECT_EQ(150, snap_position.X());
-  EXPECT_EQ(150, snap_position.Y());
+  base::Optional<FloatPoint> snap_position =
+      snap_coordinator->GetSnapPositionForPoint(
+          *snap_container, FloatPoint(150, 150), true, false);
+  EXPECT_FALSE(snap_position.has_value());
 }
 
 TEST_F(SnapCoordinatorTest, DoesNotSnapOnEmptyContainer) {
@@ -674,10 +676,11 @@
 
   SnapCoordinator* snap_coordinator = GetDocument().GetSnapCoordinator();
   LayoutBox* snap_container = scroller_element->GetLayoutBox();
-  FloatPoint snap_position = snap_coordinator->GetSnapPositionForPoint(
-      *snap_container, FloatPoint(150, 150), true, false);
-  EXPECT_EQ(150, snap_position.X());
-  EXPECT_EQ(150, snap_position.Y());
+  base::Optional<FloatPoint> snap_position =
+      snap_coordinator->GetSnapPositionForPoint(
+          *snap_container, FloatPoint(150, 150), true, false);
+  ;
+  EXPECT_FALSE(snap_position.has_value());
 }
 
 TEST_F(SnapCoordinatorTest, DoesNotSnapOnNonSnapContainer) {
@@ -690,10 +693,10 @@
 
   SnapCoordinator* snap_coordinator = GetDocument().GetSnapCoordinator();
   LayoutBox* snap_container = scroller_element->GetLayoutBox();
-  FloatPoint snap_position = snap_coordinator->GetSnapPositionForPoint(
-      *snap_container, FloatPoint(150, 150), true, false);
-  EXPECT_EQ(150, snap_position.X());
-  EXPECT_EQ(150, snap_position.Y());
+  base::Optional<FloatPoint> snap_position =
+      snap_coordinator->GetSnapPositionForPoint(
+          *snap_container, FloatPoint(150, 150), true, false);
+  EXPECT_FALSE(snap_position.has_value());
 }
 
 }  // namespace
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
index eb62213..e70d5d2 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.cc
@@ -245,6 +245,10 @@
   ScrollableArea::Trace(visitor);
 }
 
+bool PaintLayerScrollableArea::IsThrottled() const {
+  return GetLayoutBox()->GetFrame()->ShouldThrottleRendering();
+}
+
 PlatformChromeClient* PaintLayerScrollableArea::GetChromeClient() const {
   if (HasBeenDisposed())
     return nullptr;
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
index 2c51228..2514625 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area.h
@@ -262,6 +262,7 @@
     return scrollbar_manager_.VerticalScrollbar();
   }
 
+  bool IsThrottled() const override;
   PlatformChromeClient* GetChromeClient() const override;
 
   SmoothScrollSequencer* GetSmoothScrollSequencer() const override;
diff --git a/third_party/blink/renderer/core/policy/policy_test.cc b/third_party/blink/renderer/core/policy/policy_test.cc
index 4e785fbb..c218d63 100644
--- a/third_party/blink/renderer/core/policy/policy_test.cc
+++ b/third_party/blink/renderer/core/policy/policy_test.cc
@@ -69,6 +69,8 @@
   EXPECT_TRUE(GetPolicy()->allowsFeature("camera", kOriginB));
   EXPECT_FALSE(GetPolicy()->allowsFeature("camera", "https://badorigin.com"));
   EXPECT_TRUE(GetPolicy()->allowsFeature("geolocation", kSelfOrigin));
+  EXPECT_TRUE(GetPolicy()->allowsFeature("sync-xhr"));
+  EXPECT_TRUE(GetPolicy()->allowsFeature("sync-xhr", kOriginA));
 }
 
 TEST_F(DocumentPolicyTest, TestGetAllowList) {
@@ -82,6 +84,8 @@
               UnorderedElementsAre("*"));
   EXPECT_TRUE(GetPolicy()->getAllowlistForFeature("badfeature").IsEmpty());
   EXPECT_TRUE(GetPolicy()->getAllowlistForFeature("midi").IsEmpty());
+  EXPECT_THAT(GetPolicy()->getAllowlistForFeature("sync-xhr"),
+              UnorderedElementsAre("*"));
 }
 
 TEST_F(DocumentPolicyTest, TestAllowedFeatures) {
@@ -93,6 +97,8 @@
   EXPECT_TRUE(allowed_features.Contains("geolocation"));
   EXPECT_FALSE(allowed_features.Contains("badfeature"));
   EXPECT_FALSE(allowed_features.Contains("midi"));
+  // "sync-xhr" is allowed on all origins
+  EXPECT_TRUE(allowed_features.Contains("sync-xhr"));
 }
 
 TEST_F(IFramePolicyTest, TestAllowsFeature) {
@@ -110,6 +116,8 @@
   EXPECT_FALSE(GetPolicy()->allowsFeature("camera", kOriginB));
   EXPECT_FALSE(GetPolicy()->allowsFeature("camera", "https://badorigin.com"));
   EXPECT_TRUE(GetPolicy()->allowsFeature("geolocation", kSelfOrigin));
+  EXPECT_TRUE(GetPolicy()->allowsFeature("sync-xhr"));
+  EXPECT_TRUE(GetPolicy()->allowsFeature("sync-xhr", kOriginA));
 }
 
 TEST_F(IFramePolicyTest, TestGetAllowList) {
@@ -123,6 +131,8 @@
               UnorderedElementsAre(kSelfOrigin));
   EXPECT_TRUE(GetPolicy()->getAllowlistForFeature("badfeature").IsEmpty());
   EXPECT_TRUE(GetPolicy()->getAllowlistForFeature("midi").IsEmpty());
+  EXPECT_THAT(GetPolicy()->getAllowlistForFeature("sync-xhr"),
+              UnorderedElementsAre("*"));
 }
 
 TEST_F(IFramePolicyTest, TestAllowedFeatures) {
@@ -134,6 +144,8 @@
   EXPECT_TRUE(allowed_features.Contains("geolocation"));
   EXPECT_FALSE(allowed_features.Contains("badfeature"));
   EXPECT_FALSE(allowed_features.Contains("midi"));
+  // "sync-xhr" is allowed on all origins
+  EXPECT_TRUE(allowed_features.Contains("sync-xhr"));
 }
 
 TEST_F(IFramePolicyTest, TestCombinedPolicy) {
@@ -151,6 +163,8 @@
   EXPECT_TRUE(allowed_features.Contains("camera"));
   // "geolocation" has default policy as allowed on self origin.
   EXPECT_FALSE(allowed_features.Contains("badfeature"));
+  // "sync-xhr" is still implicitly allowed on all origins
+  EXPECT_TRUE(allowed_features.Contains("sync-xhr"));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/scheduler/frame_throttling_test.cc b/third_party/blink/renderer/core/scheduler/frame_throttling_test.cc
index 097abd1..63f4af4 100644
--- a/third_party/blink/renderer/core/scheduler/frame_throttling_test.cc
+++ b/third_party/blink/renderer/core/scheduler/frame_throttling_test.cc
@@ -38,7 +38,7 @@
 
 // NOTE: This test uses <iframe sandbox> to create cross origin iframes.
 
-class FrameThrottlingTest : public SimTest, public PaintTestConfigurations {
+class FrameThrottlingTest : public PaintTestConfigurations, public SimTest {
  protected:
   void SetUp() override {
     SimTest::SetUp();
diff --git a/third_party/blink/renderer/core/testing/DEPS b/third_party/blink/renderer/core/testing/DEPS
index 8109dc0a..846ae8f6f 100644
--- a/third_party/blink/renderer/core/testing/DEPS
+++ b/third_party/blink/renderer/core/testing/DEPS
@@ -1,3 +1,9 @@
 include_rules = [
+    "+cc",
+    # TODO(crbug.com/838693): Test harnesses use RenderWidgetCompositor
+    # from content instead of a fake WebLayerTreeView implementation, so
+    # that the Web abstraction can go away.
+    "+content/renderer/gpu",
+    "+content/test",
     "+gpu/command_buffer/client/gles2_interface.h",
 ]
diff --git a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc
index 2d3da9f..12f31344 100644
--- a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc
+++ b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/testing/sim/sim_compositor.h"
 
+#include "cc/test/fake_layer_tree_frame_sink.h"
 #include "third_party/blink/public/platform/web_rect.h"
 #include "third_party/blink/renderer/core/exported/web_view_impl.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
@@ -20,12 +21,17 @@
 
 namespace blink {
 
-SimCompositor::SimCompositor()
-    : needs_begin_frame_(false),
-      defer_commits_(true),
-      has_selection_(false),
-      web_view_(nullptr) {
+SimCompositor::SimCompositor() {
   LocalFrameView::SetInitialTracksPaintInvalidationsForTesting(true);
+
+  // SimCompositor overrides the RenderWidgetCompositorDelegate to respond to
+  // BeginMainFrame(), which will update and paint the WebViewImpl given to
+  // SetWebView().
+  compositor_ = compositor_factory_.Initialize(this);
+  // SimCompositor starts with defer commits enabled, but uses synchronous
+  // compositing which does not use defer commits anyhow, it only uses it for
+  // reading defered state in tests.
+  compositor_->SetDeferCommits(true);
 }
 
 SimCompositor::~SimCompositor() {
@@ -36,35 +42,21 @@
   web_view_ = &web_view;
 }
 
-void SimCompositor::SetNeedsBeginFrame() {
-  needs_begin_frame_ = true;
-}
-
-void SimCompositor::SetDeferCommits(bool defer_commits) {
-  defer_commits_ = defer_commits;
-}
-
-void SimCompositor::RegisterSelection(const WebSelection&) {
-  has_selection_ = true;
-}
-
-void SimCompositor::ClearSelection() {
-  has_selection_ = false;
-}
-
 SimCanvas::Commands SimCompositor::BeginFrame(double time_delta_in_seconds) {
   DCHECK(web_view_);
-  DCHECK(!defer_commits_);
-  DCHECK(needs_begin_frame_);
+  DCHECK(!compositor_->layer_tree_host()->defer_commits());
+  DCHECK(compositor_->layer_tree_host()->RequestedMainFramePending());
   DCHECK_GT(time_delta_in_seconds, 0);
-  needs_begin_frame_ = false;
 
   last_frame_time_ += base::TimeDelta::FromSecondsD(time_delta_in_seconds);
 
-  web_view_->BeginFrame(last_frame_time_);
-  web_view_->UpdateAllLifecyclePhases();
+  SimCanvas::Commands commands;
+  paint_commands_ = &commands;
 
-  return PaintFrame();
+  compositor_->layer_tree_host()->Composite(last_frame_time_, /*raster=*/false);
+
+  paint_commands_ = nullptr;
+  return commands;
 }
 
 SimCanvas::Commands SimCompositor::PaintFrame() {
@@ -83,4 +75,19 @@
   return canvas.GetCommands();
 }
 
+void SimCompositor::RequestNewLayerTreeFrameSink(
+    const content::LayerTreeFrameSinkCallback& callback) {
+  // Make a valid LayerTreeFrameSink so the compositor will generate begin main
+  // frames.
+  callback.Run(cc::FakeLayerTreeFrameSink::Create3d());
+}
+
+void SimCompositor::BeginMainFrame(base::TimeTicks frame_time) {
+  // There is no WebWidget like RenderWidget would have..? So go right to the
+  // WebViewImpl.
+  web_view_->BeginFrame(last_frame_time_);
+  web_view_->UpdateAllLifecyclePhases();
+  *paint_commands_ = PaintFrame();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/testing/sim/sim_compositor.h b/third_party/blink/renderer/core/testing/sim/sim_compositor.h
index 41a560c..c561c7cd 100644
--- a/third_party/blink/renderer/core/testing/sim/sim_compositor.h
+++ b/third_party/blink/renderer/core/testing/sim/sim_compositor.h
@@ -6,7 +6,9 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_SIM_SIM_COMPOSITOR_H_
 
 #include "base/time/time.h"
-#include "third_party/blink/public/platform/web_layer_tree_view.h"
+#include "content/renderer/gpu/render_widget_compositor.h"
+#include "content/test/stub_render_widget_compositor_delegate.h"
+#include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
 #include "third_party/blink/renderer/core/testing/sim/sim_canvas.h"
 
 namespace blink {
@@ -22,11 +24,18 @@
 // only part of the layer was invalid.
 //
 // Note: This also does not support compositor driven animations.
-class SimCompositor final : public WebLayerTreeView {
+class SimCompositor final : public content::StubRenderWidgetCompositorDelegate {
  public:
   explicit SimCompositor();
   ~SimCompositor() override;
 
+  // This compositor should be given to the WebViewImpl passed to SetWebView.
+  content::RenderWidgetCompositor& compositor() { return *compositor_; }
+
+  // When the compositor asks for a main frame, this WebViewImpl will have its
+  // lifecycle updated and be painted. The compositor() should have also been
+  // given to the WebViewImpl so that its using the same compositor() for its
+  // layer tree.
   void SetWebView(WebViewImpl&);
 
   // Executes the BeginMainFrame processing steps, an approximation of what
@@ -42,29 +51,43 @@
   // we don't schedule a BeginFrame).
   SimCanvas::Commands PaintFrame();
 
-  bool NeedsBeginFrame() const { return needs_begin_frame_; }
-  bool DeferCommits() const { return defer_commits_; }
-
-  bool HasSelection() const { return has_selection_; }
-
-  void SetBackgroundColor(SkColor background_color) override {
-    background_color_ = background_color;
+  // Helpers to query the state of the compositor from tests.
+  //
+  // Returns true if a main frame has been requested from blink, until the
+  // BeginFrame() step occurs.
+  bool NeedsBeginFrame() const {
+    return compositor_->layer_tree_host()->RequestedMainFramePending();
+  }
+  // Returns true if commits are deferred in the compositor. Since these tests
+  // use synchronous compositing through BeginFrame(), the deferred state has no
+  // real effect.
+  bool DeferCommits() const {
+    return compositor_->layer_tree_host()->defer_commits();
+  }
+  // Returns true if a selection is set on the compositor.
+  bool HasSelection() const {
+    return compositor_->layer_tree_host()->selection() != cc::LayerSelection();
+  }
+  // Returns the background color set on the compositor.
+  SkColor background_color() {
+    return compositor_->layer_tree_host()->background_color();
   }
 
-  SkColor background_color() { return background_color_; }
-
  private:
-  void SetNeedsBeginFrame() override;
-  void SetDeferCommits(bool) override;
-  void RegisterSelection(const WebSelection&) override;
-  void ClearSelection() override;
+  // RenderWidgetCompositorDelegate implementation.
+  void RequestNewLayerTreeFrameSink(
+      const content::LayerTreeFrameSinkCallback& callback) override;
+  void BeginMainFrame(base::TimeTicks frame_time) override;
 
-  bool needs_begin_frame_;
-  bool defer_commits_;
-  bool has_selection_;
-  WebViewImpl* web_view_;
+  WebViewImpl* web_view_ = nullptr;
   base::TimeTicks last_frame_time_;
-  SkColor background_color_;
+
+  // During BeginFrame(), painting is done, and the result is stored here to
+  // be returned from BeginFrame().
+  SimCanvas::Commands* paint_commands_;
+
+  content::RenderWidgetCompositor* compositor_ = nullptr;
+  FrameTestHelpers::RenderWidgetCompositorFactory compositor_factory_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/testing/sim/sim_test.cc b/third_party/blink/renderer/core/testing/sim/sim_test.cc
index ab5ee76..ec2c89aa 100644
--- a/third_party/blink/renderer/core/testing/sim/sim_test.cc
+++ b/third_party/blink/renderer/core/testing/sim/sim_test.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/testing/sim/sim_test.h"
 
+#include "content/test/test_blink_web_unit_test_support.h"
 #include "third_party/blink/public/platform/web_cache.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/exported/web_view_impl.h"
@@ -15,7 +16,8 @@
 
 namespace blink {
 
-SimTest::SimTest() : web_view_client_(compositor_), web_frame_client_(*this) {
+SimTest::SimTest()
+    : web_view_client_(compositor_.compositor()), web_frame_client_(*this) {
   Document::SetThreadedParsingEnabledForTesting(false);
   // Use the mock theme to get more predictable code paths, this also avoids
   // the OS callbacks in ScrollAnimatorMac which can schedule frames
@@ -25,6 +27,13 @@
   // in the middle of a test.
   LayoutTestSupport::SetMockThemeEnabledForTest(true);
   ScrollbarTheme::SetMockScrollbarsEnabled(true);
+  // Threaded animations are usually enabled for blink. However these tests use
+  // synchronous compositing, which can not run threaded animations.
+  bool was_threaded_animation_enabled =
+      content::TestBlinkWebUnitTestSupport::SetThreadedAnimationEnabled(false);
+  // If this fails, we'd be resetting IsThreadedAnimationEnabled() to the wrong
+  // thing in the destructor.
+  DCHECK(was_threaded_animation_enabled);
 }
 
 SimTest::~SimTest() {
@@ -34,6 +43,7 @@
   Document::SetThreadedParsingEnabledForTesting(true);
   LayoutTestSupport::SetMockThemeEnabledForTest(false);
   ScrollbarTheme::SetMockScrollbarsEnabled(false);
+  content::TestBlinkWebUnitTestSupport::SetThreadedAnimationEnabled(true);
   WebCache::Clear();
 }
 
diff --git a/third_party/blink/renderer/core/testing/sim/sim_web_view_client.cc b/third_party/blink/renderer/core/testing/sim/sim_web_view_client.cc
index 902accf..ceb85294 100644
--- a/third_party/blink/renderer/core/testing/sim/sim_web_view_client.cc
+++ b/third_party/blink/renderer/core/testing/sim/sim_web_view_client.cc
@@ -4,16 +4,15 @@
 
 #include "third_party/blink/renderer/core/testing/sim/sim_web_view_client.h"
 
-#include "third_party/blink/public/platform/web_layer_tree_view.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 
 namespace blink {
 
-SimWebViewClient::SimWebViewClient(WebLayerTreeView& layer_tree_view)
+SimWebViewClient::SimWebViewClient(content::RenderWidgetCompositor& compositor)
     : visually_non_empty_layout_count_(0),
       finished_parsing_layout_count_(0),
       finished_loading_layout_count_(0),
-      layer_tree_view_(&layer_tree_view) {}
+      compositor_(&compositor) {}
 
 void SimWebViewClient::DidMeaningfulLayout(
     WebMeaningfulLayout meaningful_layout) {
@@ -30,6 +29,10 @@
   }
 }
 
+WebLayerTreeView* SimWebViewClient::InitializeLayerTreeView() {
+  return compositor_;
+}
+
 WebView* SimWebViewClient::CreateView(WebLocalFrame* opener,
                                       const WebURLRequest&,
                                       const WebWindowFeatures&,
diff --git a/third_party/blink/renderer/core/testing/sim/sim_web_view_client.h b/third_party/blink/renderer/core/testing/sim/sim_web_view_client.h
index 4296908b..549f246 100644
--- a/third_party/blink/renderer/core/testing/sim/sim_web_view_client.h
+++ b/third_party/blink/renderer/core/testing/sim/sim_web_view_client.h
@@ -7,17 +7,17 @@
 
 #include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
 
-namespace blink {
+namespace content {
+class RenderWidgetCompositor;
+}
 
-class WebLayerTreeView;
+namespace blink {
 
 class SimWebViewClient final : public FrameTestHelpers::TestWebViewClient {
  public:
-  explicit SimWebViewClient(WebLayerTreeView&);
-
-  WebLayerTreeView* InitializeLayerTreeView() override {
-    return layer_tree_view_;
-  }
+  // The RenderWidgetCompositor to be returned from InitializeLayerTreeView()
+  // must be constructed before this class, and given to it.
+  explicit SimWebViewClient(content::RenderWidgetCompositor&);
 
   int VisuallyNonEmptyLayoutCount() const {
     return visually_non_empty_layout_count_;
@@ -29,6 +29,8 @@
     return finished_loading_layout_count_;
   }
 
+  // WebViewClient implementation.
+  WebLayerTreeView* InitializeLayerTreeView() override;
   WebView* CreateView(WebLocalFrame* opener,
                       const WebURLRequest&,
                       const WebWindowFeatures&,
@@ -45,7 +47,7 @@
   int finished_parsing_layout_count_;
   int finished_loading_layout_count_;
 
-  WebLayerTreeView* layer_tree_view_;
+  content::RenderWidgetCompositor* compositor_;
   FrameTestHelpers::WebViewHelper web_view_helper_;
 };
 
diff --git a/third_party/blink/renderer/core/xml/document_xpath_evaluator.cc b/third_party/blink/renderer/core/xml/document_xpath_evaluator.cc
index d707139..e1a14911 100644
--- a/third_party/blink/renderer/core/xml/document_xpath_evaluator.cc
+++ b/third_party/blink/renderer/core/xml/document_xpath_evaluator.cc
@@ -25,6 +25,7 @@
 
 #include "third_party/blink/renderer/core/xml/document_xpath_evaluator.h"
 
+#include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/core/xml/xpath_expression.h"
 #include "third_party/blink/renderer/core/xml/xpath_result.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
diff --git a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
index b6f11ab..148f14f 100644
--- a/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
+++ b/third_party/blink/renderer/modules/animationworklet/worklet_animation.cc
@@ -12,6 +12,7 @@
 #include "third_party/blink/renderer/core/animation/keyframe_effect_model.h"
 #include "third_party/blink/renderer/core/animation/scroll_timeline.h"
 #include "third_party/blink/renderer/core/animation/timing.h"
+#include "third_party/blink/renderer/core/animation/worklet_animation_controller.h"
 #include "third_party/blink/renderer/core/dom/node.h"
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
diff --git a/third_party/blink/renderer/modules/webaudio/audio_node_output.cc b/third_party/blink/renderer/modules/webaudio/audio_node_output.cc
index d3084c4..c229c43 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_node_output.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_node_output.cc
@@ -170,7 +170,7 @@
 
 void AudioNodeOutput::RemoveInput(AudioNodeInput& input) {
   DCHECK(GetDeferredTaskHandler().IsGraphOwner());
-  input.Handler().BreakConnection();
+  input.Handler().BreakConnectionWithLock();
   inputs_.erase(&input);
 }
 
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index 4fc58b3..cead58e1 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -1690,7 +1690,7 @@
 
   deps = [
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//services/service_manager/public/cpp",
     "//skia",
@@ -1920,7 +1920,7 @@
     "//base/test:test_support",
     "//cc",
     "//cc:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//mojo/public/cpp/bindings/tests:for_blink_tests",
     "//mojo/public/cpp/test_support:test_utils",
     "//mojo/public/interfaces/bindings/tests:test_interfaces_blink",
@@ -1960,7 +1960,7 @@
 
   deps = [
     ":platform",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//third_party/blink/renderer/platform/wtf",
   ]
 
diff --git a/third_party/blink/renderer/platform/animation/compositor_animation.cc b/third_party/blink/renderer/platform/animation/compositor_animation.cc
index 79a0b4c..547ea22 100644
--- a/third_party/blink/renderer/platform/animation/compositor_animation.cc
+++ b/third_party/blink/renderer/platform/animation/compositor_animation.cc
@@ -68,16 +68,17 @@
   animation_->AddKeyframeModel(keyframe_model->ReleaseCcKeyframeModel());
 }
 
-void CompositorAnimation::RemoveKeyframeModels() {
-  animation_->RemoveKeyframeModels();
+void CompositorAnimation::RemoveKeyframeModel(int keyframe_model_id) {
+  animation_->RemoveKeyframeModel(keyframe_model_id);
 }
 
-void CompositorAnimation::PauseKeyframeEffect(double time_offset) {
-  animation_->PauseKeyframeEffect(time_offset);
+void CompositorAnimation::PauseKeyframeModel(int keyframe_model_id,
+                                             double time_offset) {
+  animation_->PauseKeyframeModel(keyframe_model_id, time_offset);
 }
 
-void CompositorAnimation::AbortKeyframeEffect() {
-  animation_->AbortKeyframeEffect();
+void CompositorAnimation::AbortKeyframeModel(int keyframe_model_id) {
+  animation_->AbortKeyframeModel(keyframe_model_id);
 }
 
 void CompositorAnimation::UpdateScrollTimelineId(
diff --git a/third_party/blink/renderer/platform/animation/compositor_animation.h b/third_party/blink/renderer/platform/animation/compositor_animation.h
index 1746ef4..c604a184 100644
--- a/third_party/blink/renderer/platform/animation/compositor_animation.h
+++ b/third_party/blink/renderer/platform/animation/compositor_animation.h
@@ -56,9 +56,9 @@
   bool IsElementAttached() const;
 
   void AddKeyframeModel(std::unique_ptr<CompositorKeyframeModel>);
-  void RemoveKeyframeModels();
-  void PauseKeyframeEffect(double time_offset);
-  void AbortKeyframeEffect();
+  void RemoveKeyframeModel(int keyframe_model_id);
+  void PauseKeyframeModel(int keyframe_model_id, double time_offset);
+  void AbortKeyframeModel(int keyframe_model_id);
 
   void UpdateScrollTimelineId(base::Optional<cc::ElementId>);
 
diff --git a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
index 20783eb..a608fba 100644
--- a/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
+++ b/third_party/blink/renderer/platform/fonts/shaping/shape_result.cc
@@ -1176,10 +1176,14 @@
       if (rtl && next_character_index + 1 == character_index)
         continue;
 
-      // For glyphs with the same character index the first one wins in LTR so
-      // no need to do anything special.
+      // For glyphs with the same character index in LTR take the advance from
+      // the last one but the safe to break flag from the first.
       DCHECK_LT(character_index, num_characters_);
-      data[character_index] = {total_advance, glyph_data.safe_to_break_before};
+      bool safe_to_break =
+          next_character_index > character_index
+              ? data[next_character_index - 1].safe_to_break_before
+              : glyph_data.safe_to_break_before;
+      data[character_index] = {total_advance, safe_to_break};
 
       total_advance += glyph_data.advance;
       next_character_index = character_index + (!rtl ? 1 : -1);
@@ -1226,8 +1230,9 @@
 }
 
 unsigned ShapeResult::CachedNextSafeToBreakOffset(unsigned offset) const {
-  // TODO(layout-dev): Use character_position_->NextSafeToBreakOffset(index)
-  // once fully implemented. Fails fast/text/trailing_whitespace_wrapping.html
+  // TODO(layout-dev): Use character_position_ for RTL once supported.
+  if (!Rtl())
+    return character_position_->NextSafeToBreakOffset(offset);
   return NextSafeToBreakOffset(offset);
 }
 
@@ -1290,9 +1295,9 @@
   if (adjusted_offset == 0)
     return start_offset_;
 
-  unsigned length = data_.size() - 1;
+  unsigned length = data_.size();
   for (unsigned i = adjusted_offset; i < length; i++) {
-    if (data_[i + 1].safe_to_break_before)
+    if (data_[i].safe_to_break_before)
       return start_offset_ + i;
   }
 
diff --git a/third_party/blink/renderer/platform/geometry/float_point.cc b/third_party/blink/renderer/platform/geometry/float_point.cc
index 75a820a..fda6393 100644
--- a/third_party/blink/renderer/platform/geometry/float_point.cc
+++ b/third_party/blink/renderer/platform/geometry/float_point.cc
@@ -116,6 +116,10 @@
   return gfx::ScrollOffset(x_, y_);
 }
 
+FloatPoint::operator gfx::Vector2dF() const {
+  return gfx::Vector2dF(x_, y_);
+}
+
 std::ostream& operator<<(std::ostream& ostream, const FloatPoint& point) {
   return ostream << point.ToString();
 }
diff --git a/third_party/blink/renderer/platform/geometry/float_point.h b/third_party/blink/renderer/platform/geometry/float_point.h
index fcabd694..acca3168 100644
--- a/third_party/blink/renderer/platform/geometry/float_point.h
+++ b/third_party/blink/renderer/platform/geometry/float_point.h
@@ -47,6 +47,7 @@
 namespace gfx {
 class PointF;
 class ScrollOffset;
+class Vector2dF;
 }
 
 namespace blink {
@@ -135,6 +136,7 @@
 
   operator gfx::PointF() const;
   explicit operator gfx::ScrollOffset() const;
+  explicit operator gfx::Vector2dF() const;
 
   String ToString() const;
 
diff --git a/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc b/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc
index 1369b31..d2fd8f5 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc
+++ b/third_party/blink/renderer/platform/graphics/graphics_layer_test.cc
@@ -167,6 +167,7 @@
   std::unique_ptr<CompositorKeyframeModel> float_keyframe_model(
       CompositorKeyframeModel::Create(*curve, CompositorTargetProperty::OPACITY,
                                       0, 0));
+  int keyframe_model_id = float_keyframe_model->Id();
 
   std::unique_ptr<CompositorAnimationTimeline> compositor_timeline =
       CompositorAnimationTimeline::Create();
@@ -195,7 +196,7 @@
 
   EXPECT_TRUE(
       mutator->HasTickingKeyframeModelForTesting(cc_layer_->element_id()));
-  animation.GetCompositorAnimation()->RemoveKeyframeModels();
+  animation.GetCompositorAnimation()->RemoveKeyframeModel(keyframe_model_id);
   EXPECT_FALSE(
       mutator->HasTickingKeyframeModelForTesting(cc_layer_->element_id()));
 
diff --git a/third_party/blink/renderer/platform/graphics/test/fake_scrollable_area.h b/third_party/blink/renderer/platform/graphics/test/fake_scrollable_area.h
index 1d0bc8d..04625e3 100644
--- a/third_party/blink/renderer/platform/graphics/test/fake_scrollable_area.h
+++ b/third_party/blink/renderer/platform/graphics/test/fake_scrollable_area.h
@@ -29,6 +29,7 @@
     return CompositorElementId();
   }
   bool IsActive() const override { return false; }
+  bool IsThrottled() const override { return false; }
   int ScrollSize(ScrollbarOrientation) const override { return 100; }
   bool IsScrollCornerVisible() const override { return false; }
   IntRect ScrollCornerRect() const override { return IntRect(); }
diff --git a/third_party/blink/renderer/platform/loader/BUILD.gn b/third_party/blink/renderer/platform/loader/BUILD.gn
index 2f3598e..2e03074 100644
--- a/third_party/blink/renderer/platform/loader/BUILD.gn
+++ b/third_party/blink/renderer/platform/loader/BUILD.gn
@@ -72,6 +72,8 @@
     "fetch/script_fetch_options.h",
     "fetch/source_keyed_cached_metadata_handler.cc",
     "fetch/source_keyed_cached_metadata_handler.h",
+    "fetch/stale_revalidation_resource_client.cc",
+    "fetch/stale_revalidation_resource_client.h",
     "fetch/substitute_data.h",
     "fetch/text_resource_decoder_options.cc",
     "fetch/text_resource_decoder_options.h",
diff --git a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
index 3948868..5e41c90 100644
--- a/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
+++ b/third_party/blink/renderer/platform/loader/fetch/fetch_parameters.h
@@ -139,6 +139,11 @@
     options_.initiator_info.is_link_preload = is_link_preload;
   }
 
+  bool IsStaleRevalidation() const { return is_stale_revalidation_; }
+  void SetStaleRevalidation(bool is_stale_revalidation) {
+    is_stale_revalidation_ = is_stale_revalidation;
+  }
+
   void SetContentSecurityCheck(
       ContentSecurityPolicyDisposition content_security_policy_option) {
     options_.content_security_policy_option = content_security_policy_option;
@@ -206,6 +211,7 @@
   ResourceWidth resource_width_;
   ClientHintsPreferences client_hint_preferences_;
   PlaceholderImageRequestType placeholder_image_request_type_;
+  bool is_stale_revalidation_ = false;
 };
 
 // This class is needed to copy a FetchParameters across threads, because it
diff --git a/third_party/blink/renderer/platform/loader/fetch/raw_resource.h b/third_party/blink/renderer/platform/loader/fetch/raw_resource.h
index 5a6c6d5..950e634 100644
--- a/third_party/blink/renderer/platform/loader/fetch/raw_resource.h
+++ b/third_party/blink/renderer/platform/loader/fetch/raw_resource.h
@@ -142,13 +142,15 @@
 
 // TODO(yhirano): Recover #if ENABLE_SECURITY_ASSERT when we stop adding
 // RawResources to MemoryCache.
-inline bool IsRawResource(const Resource& resource) {
-  Resource::Type type = resource.GetType();
+inline bool IsRawResource(Resource::Type type) {
   return type == Resource::kMainResource || type == Resource::kRaw ||
          type == Resource::kTextTrack || type == Resource::kAudio ||
          type == Resource::kVideo || type == Resource::kManifest ||
          type == Resource::kImportResource;
 }
+inline bool IsRawResource(const Resource& resource) {
+  return IsRawResource(resource.GetType());
+}
 inline RawResource* ToRawResource(Resource* resource) {
   SECURITY_DCHECK(!resource || IsRawResource(*resource));
   return static_cast<RawResource*>(resource);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.cc b/third_party/blink/renderer/platform/loader/fetch/resource.cc
index 6d9cc88..c43942ae 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource.cc
@@ -1105,7 +1105,7 @@
       GetResourceRequest(), GetResponse(), response_timestamp_);
 }
 
-bool Resource::AsyncRevalidationRequested() const {
+bool Resource::StaleRevalidationRequested() const {
   if (GetResponse().AsyncRevalidationRequested())
     return true;
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource.h b/third_party/blink/renderer/platform/loader/fetch/resource.h
index e49aedf..eb30e6a 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource.h
@@ -268,9 +268,17 @@
   bool HasCacheControlNoStoreHeader() const;
   bool MustReloadDueToVaryHeader(const ResourceRequest& new_request) const;
 
-  // Returns true if any resource in the request chain has revalidation
-  // requested.
-  bool AsyncRevalidationRequested() const;
+  // Returns true if any response returned from the upstream in the redirect
+  // chain is stale and requires triggering async stale revalidation. Once
+  // revalidation is started SetStaleRevalidationStarted() should be called.
+  bool StaleRevalidationRequested() const;
+
+  // Set that stale revalidation has been started so that subsequent
+  // requests won't trigger it again. When stale revalidation is completed
+  // this resource will be removed from the MemoryCache so there is no
+  // need to reset it back to false.
+  bool StaleRevalidationStarted() const { return stale_revalidation_started_; }
+  void SetStaleRevalidationStarted() { stale_revalidation_started_ = true; }
 
   const IntegrityMetadataSet& IntegrityMetadata() const {
     return options_.integrity_metadata;
@@ -521,6 +529,7 @@
   bool is_add_remove_client_prohibited_;
   bool is_revalidation_start_forbidden_ = false;
   bool is_unused_preload_ = false;
+  bool stale_revalidation_started_ = false;
 
   ResourceIntegrityDisposition integrity_disposition_;
   SubresourceIntegrity::ReportInfo integrity_report_info_;
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index d38fc90..9f2cc12 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -48,6 +48,7 @@
 #include "third_party/blink/renderer/platform/loader/fetch/resource_loader.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_loading_log.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_timing_info.h"
+#include "third_party/blink/renderer/platform/loader/fetch/stale_revalidation_resource_client.h"
 #include "third_party/blink/renderer/platform/loader/fetch/unique_identifier.h"
 #include "third_party/blink/renderer/platform/mhtml/archive_resource.h"
 #include "third_party/blink/renderer/platform/mhtml/mhtml_archive.h"
@@ -596,6 +597,11 @@
   if (is_static_data)
     return;
 
+  DEFINE_THREAD_SAFE_STATIC_LOCAL(
+      BooleanHistogram, resource_histogram,
+      ("Blink.ResourceFetcher.StaleWhileRevalidate"));
+  resource_histogram.Count(params.IsStaleRevalidation());
+
   if (params.IsSpeculativePreload() || params.IsLinkPreload()) {
     DEFINE_RESOURCE_HISTOGRAM("Preload.");
   } else {
@@ -682,6 +688,18 @@
   if (resource_type == Resource::kLinkPrefetch)
     resource_request.SetHTTPHeaderField(HTTPNames::Purpose, "prefetch");
 
+  // Indicate whether the network stack can return a stale resource. If a
+  // stale resource is returned a StaleRevalidation request will be scheduled.
+  // Explicitly disallow stale responses for fetchers that don't have SWR
+  // enabled (via origin trial), non-GET requests and resource requests that
+  // are raw. We are explicitly excluding RawResources here to avoid
+  // unintentional SWR, as bugs around RawResources tend to be complicated and
+  // critical.
+  resource_request.SetAllowStaleResponse(
+      stale_while_revalidate_enabled_ &&
+      resource_request.HttpMethod() == HTTPNames::GET &&
+      !IsRawResource(resource_type) && !params.IsStaleRevalidation());
+
   Context().AddAdditionalRequestHeaders(
       resource_request, (resource_type == Resource::kMainResource)
                             ? kFetchMainResource
@@ -795,7 +813,8 @@
 
   bool is_data_url = resource_request.Url().ProtocolIsData();
   bool is_static_data = is_data_url || substitute_data.IsValid() || archive_;
-  if (is_static_data) {
+  bool is_stale_revalidation = params.IsStaleRevalidation();
+  if (!is_stale_revalidation && is_static_data) {
     resource = ResourceForStaticData(params, factory, substitute_data);
     if (resource) {
       policy =
@@ -810,7 +829,7 @@
     }
   }
 
-  if (!resource) {
+  if (!is_stale_revalidation && !resource) {
     resource = MatchPreload(params, resource_type);
     if (resource) {
       policy = kUse;
@@ -840,6 +859,11 @@
       InitializeRevalidation(resource_request, resource);
       break;
     case kUse:
+      if (resource_request.AllowsStaleResponse() &&
+          resource->ShouldRevalidateStaleResponse()) {
+        ScheduleStaleRevalidate(resource);
+      }
+
       if (resource->IsLinkPreload() && !params.IsLinkPreload())
         resource->SetLinkPreload(false);
       break;
@@ -872,8 +896,10 @@
   // If only the fragment identifiers differ, it is the same resource.
   DCHECK(EqualIgnoringFragmentIdentifier(resource->Url(), params.Url()));
   RequestLoadStarted(identifier, resource, params, policy, is_static_data);
-  cached_resources_map_.Set(
-      MemoryCache::RemoveFragmentIdentifierIfNeeded(params.Url()), resource);
+  if (!is_stale_revalidation) {
+    cached_resources_map_.Set(
+        MemoryCache::RemoveFragmentIdentifierIfNeeded(params.Url()), resource);
+  }
   document_resources_.insert(resource);
 
   // Returns with an existing resource if the resource does not need to start
@@ -959,7 +985,7 @@
     const FetchParameters& params,
     const ResourceFactory& factory) {
   const String cache_identifier = GetCacheIdentifier();
-  DCHECK(!IsMainThread() ||
+  DCHECK(!IsMainThread() || params.IsStaleRevalidation() ||
          !GetMemoryCache()->ResourceForURL(params.GetResourceRequest().Url(),
                                            cache_identifier));
 
@@ -1074,6 +1100,7 @@
                                                  Resource::Type type) {
   if (!params.IsSpeculativePreload() && !params.IsLinkPreload())
     return;
+  DCHECK(!params.IsStaleRevalidation());
   // CSP layout tests verify that preloads are subject to access checks by
   // seeing if they are in the `preload started` list. Therefore do not add
   // them to the list if the load is immediately denied.
@@ -1268,7 +1295,7 @@
   // example).
   if (request.GetCacheMode() == mojom::FetchCacheMode::kValidateCache ||
       existing_resource.MustRevalidateDueToCacheHeaders(
-          false /* allow_stale */) ||
+          request.AllowsStaleResponse()) ||
       request.CacheControlContainsNoCache()) {
     // Revalidation is harmful for non-matched preloads because it may lead to
     // sharing one preloaded resource among multiple ResourceFetchers.
@@ -1512,9 +1539,22 @@
       resource->Identifier(), finish_time, encoded_data_length,
       resource->GetResponse().DecodedBodyLength(), should_report_corb_blocking);
 
-  if (type == kDidFinishLoading)
+  if (type == kDidFinishLoading) {
     resource->Finish(finish_time, Context().GetLoadingTaskRunner().get());
 
+    // Since this resource came from the network stack we only schedule a stale
+    // while revalidate request if the network asked us to. If we called
+    // ShouldRevalidateStaleResponse here then the resource would be checking
+    // the freshness based on current time. It is possible that the resource
+    // is fresh at the time of the network stack handling but not at the time
+    // handling here and we should not be forcing a revalidation in that case.
+    // eg. network stack returning a resource with max-age=0.
+    if (resource->GetResourceRequest().AllowsStaleResponse() &&
+        resource->StaleRevalidationRequested()) {
+      ScheduleStaleRevalidate(resource);
+    }
+  }
+
   HandleLoadCompletion(resource);
 }
 
@@ -1756,6 +1796,28 @@
   StopFetchingInternal(StopFetchingTarget::kIncludingKeepaliveLoaders);
 }
 
+void ResourceFetcher::ScheduleStaleRevalidate(Resource* stale_resource) {
+  if (stale_resource->StaleRevalidationStarted())
+    return;
+  stale_resource->SetStaleRevalidationStarted();
+  Context().GetLoadingTaskRunner()->PostTask(
+      FROM_HERE,
+      WTF::Bind(&ResourceFetcher::RevalidateStaleResource,
+                WrapWeakPersistent(this), WrapPersistent(stale_resource)));
+}
+
+void ResourceFetcher::RevalidateStaleResource(Resource* stale_resource) {
+  // Creating FetchParams from Resource::GetResourceRequest doesn't create
+  // the exact same request as the original one, while for revalidation
+  // purpose this is probably fine.
+  // TODO(dtapuska): revisit this when we have a better way to re-dispatch
+  // requests.
+  FetchParameters params(stale_resource->GetResourceRequest());
+  params.SetStaleRevalidation(true);
+  RawResource::Fetch(params, this,
+                     new StaleRevalidationResourceClient(stale_resource));
+}
+
 void ResourceFetcher::Trace(blink::Visitor* visitor) {
   visitor->Trace(context_);
   visitor->Trace(scheduler_);
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
index 38152b32..bdb109d 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h
@@ -279,6 +279,9 @@
                               const ResourceFactory&,
                               bool is_static_data) const;
 
+  void ScheduleStaleRevalidate(Resource* stale_resource);
+  void RevalidateStaleResource(Resource* stale_resource);
+
   Member<FetchContext> context_;
   Member<ResourceLoadScheduler> scheduler_;
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
index 276acaa0..1ced6f8b 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher_test.cc
@@ -864,4 +864,50 @@
   }
 }
 
+TEST_F(ResourceFetcherTest, StaleWhileRevalidate) {
+  scoped_refptr<const SecurityOrigin> source_origin =
+      SecurityOrigin::CreateUniqueOpaque();
+  Context()->SetSecurityOrigin(source_origin);
+  ResourceFetcher* fetcher = ResourceFetcher::Create(Context());
+
+  KURL url("http://127.0.0.1:8000/foo.html");
+  FetchParameters fetch_params{ResourceRequest(url)};
+
+  ResourceResponse response(url);
+  response.SetHTTPStatusCode(200);
+  response.SetHTTPHeaderField(HTTPNames::Cache_Control,
+                              "max-age=0, stale-while-revalidate=40");
+
+  RegisterMockedURLLoadWithCustomResponse(url, response);
+  Resource* resource = MockResource::Fetch(fetch_params, fetcher, nullptr);
+  ASSERT_TRUE(resource);
+
+  platform_->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
+  EXPECT_TRUE(resource->IsLoaded());
+  EXPECT_TRUE(GetMemoryCache()->Contains(resource));
+
+  fetcher->SetStaleWhileRevalidateEnabled(true);
+  ResourceRequest resource_request(url);
+  resource_request.SetRequestContext(WebURLRequest::kRequestContextInternal);
+  fetch_params = FetchParameters(resource_request);
+  Resource* new_resource = MockResource::Fetch(fetch_params, fetcher, nullptr);
+  EXPECT_EQ(resource, new_resource);
+  platform_->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
+  EXPECT_TRUE(resource->IsLoaded());
+
+  // Advance the clock, make sure the original resource gets removed from the
+  // memory cache after the revalidation completes.
+  platform_->AdvanceClockSeconds(1);
+  ResourceResponse revalidate_response(url);
+  revalidate_response.SetHTTPStatusCode(200);
+  platform_->GetURLLoaderMockFactory()->UnregisterURL(url);
+  RegisterMockedURLLoadWithCustomResponse(url, revalidate_response);
+  new_resource = MockResource::Fetch(fetch_params, fetcher, nullptr);
+  EXPECT_EQ(resource, new_resource);
+  EXPECT_TRUE(GetMemoryCache()->Contains(resource));
+  platform_->RunUntilIdle();
+  platform_->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
+  EXPECT_FALSE(GetMemoryCache()->Contains(resource));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_test.cc b/third_party/blink/renderer/platform/loader/fetch/resource_test.cc
index 4c20b71f..b70b58b 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_test.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_test.cc
@@ -484,7 +484,7 @@
   EXPECT_FALSE(resource->MustRevalidateDueToCacheHeaders(false));
   EXPECT_FALSE(resource->MustRevalidateDueToCacheHeaders(true));
   EXPECT_TRUE(resource->ShouldRevalidateStaleResponse());
-  EXPECT_TRUE(resource->AsyncRevalidationRequested());
+  EXPECT_TRUE(resource->StaleRevalidationRequested());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/stale_revalidation_resource_client.cc b/third_party/blink/renderer/platform/loader/fetch/stale_revalidation_resource_client.cc
new file mode 100644
index 0000000..44de6e79
--- /dev/null
+++ b/third_party/blink/renderer/platform/loader/fetch/stale_revalidation_resource_client.cc
@@ -0,0 +1,33 @@
+// 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 "third_party/blink/renderer/platform/loader/fetch/stale_revalidation_resource_client.h"
+
+#include "third_party/blink/renderer/platform/loader/fetch/memory_cache.h"
+
+namespace blink {
+
+StaleRevalidationResourceClient::StaleRevalidationResourceClient(
+    Resource* stale_resource)
+    : stale_resource_(stale_resource) {}
+
+StaleRevalidationResourceClient::~StaleRevalidationResourceClient() = default;
+
+void StaleRevalidationResourceClient::NotifyFinished(Resource* resource) {
+  // After the load is finished
+  if (stale_resource_ && IsMainThread())
+    GetMemoryCache()->Remove(stale_resource_);
+  ClearResource();
+}
+
+void StaleRevalidationResourceClient::Trace(blink::Visitor* visitor) {
+  visitor->Trace(stale_resource_);
+  RawResourceClient::Trace(visitor);
+}
+
+String StaleRevalidationResourceClient::DebugName() const {
+  return "StaleRevalidation";
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/stale_revalidation_resource_client.h b/third_party/blink/renderer/platform/loader/fetch/stale_revalidation_resource_client.h
new file mode 100644
index 0000000..2ee9adc9d
--- /dev/null
+++ b/third_party/blink/renderer/platform/loader/fetch/stale_revalidation_resource_client.h
@@ -0,0 +1,40 @@
+// 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 THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_STALE_REVALIDATION_RESOURCE_CLIENT_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_STALE_REVALIDATION_RESOURCE_CLIENT_H_
+
+#include "third_party/blink/renderer/platform/loader/fetch/raw_resource.h"
+
+namespace blink {
+
+// Stale Revalidation Resources are requests to the network stack without the
+// allow staleness bit set on. This should cause the network stack's http cache
+// to revalidate the resource. When the request has been completed the original
+// resource will be removed from the memory cache.
+class StaleRevalidationResourceClient
+    : public GarbageCollectedFinalized<StaleRevalidationResourceClient>,
+      public RawResourceClient {
+  USING_GARBAGE_COLLECTED_MIXIN(StaleRevalidationResourceClient);
+
+ public:
+  explicit StaleRevalidationResourceClient(Resource* stale_resource);
+  ~StaleRevalidationResourceClient() override;
+
+  // RawResourceClient overloads.
+  void NotifyFinished(Resource* resource) override;
+  void Trace(blink::Visitor* visitor) override;
+  String DebugName() const override;
+
+ private:
+  // |stale_resource_| is the original resource that will be removed from the
+  // MemoryCache when this revalidation request is completed. Note that it is
+  // different than the active resource for this resource client which accessed
+  // via |GetResource()|.
+  WeakMember<Resource> stale_resource_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_LOADER_FETCH_STALE_REVALIDATION_RESOURCE_CLIENT_H_
diff --git a/third_party/blink/renderer/platform/loader/testing/fetch_testing_platform_support.cc b/third_party/blink/renderer/platform/loader/testing/fetch_testing_platform_support.cc
index ac86a8c..5bf9398 100644
--- a/third_party/blink/renderer/platform/loader/testing/fetch_testing_platform_support.cc
+++ b/third_party/blink/renderer/platform/loader/testing/fetch_testing_platform_support.cc
@@ -12,6 +12,7 @@
 #include "third_party/blink/renderer/platform/loader/fetch/resource_error.h"
 #include "third_party/blink/renderer/platform/loader/testing/mock_fetch_context.h"
 #include "third_party/blink/renderer/platform/loader/testing/web_url_loader_factory_with_mock.h"
+#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h"
 #include "third_party/blink/renderer/platform/testing/weburl_loader_mock_factory_impl.h"
 
 namespace blink {
@@ -29,7 +30,8 @@
 MockFetchContext* FetchTestingPlatformSupport::Context() {
   if (!context_) {
     context_ =
-        MockFetchContext::Create(MockFetchContext::kShouldLoadNewResource);
+        MockFetchContext::Create(MockFetchContext::kShouldLoadNewResource,
+                                 scheduler_->DefaultTaskRunner());
   }
   return context_;
 }
diff --git a/third_party/blink/renderer/platform/scroll/scroll_animator_compositor_coordinator.cc b/third_party/blink/renderer/platform/scroll/scroll_animator_compositor_coordinator.cc
index ecb5c88..85be672 100644
--- a/third_party/blink/renderer/platform/scroll/scroll_animator_compositor_coordinator.cc
+++ b/third_party/blink/renderer/platform/scroll/scroll_animator_compositor_coordinator.cc
@@ -82,12 +82,12 @@
 
 void ScrollAnimatorCompositorCoordinator::RemoveAnimation() {
   if (compositor_animation_->IsElementAttached())
-    compositor_animation_->RemoveKeyframeModels();
+    compositor_animation_->RemoveKeyframeModel(compositor_animation_id_);
 }
 
 void ScrollAnimatorCompositorCoordinator::AbortAnimation() {
   if (compositor_animation_->IsElementAttached())
-    compositor_animation_->AbortKeyframeEffect();
+    compositor_animation_->AbortKeyframeModel(compositor_animation_id_);
 }
 
 void ScrollAnimatorCompositorCoordinator::CancelAnimation() {
diff --git a/third_party/blink/renderer/platform/scroll/scroll_animator_test.cc b/third_party/blink/renderer/platform/scroll/scroll_animator_test.cc
index 639eaf1..8a8441eb 100644
--- a/third_party/blink/renderer/platform/scroll/scroll_animator_test.cc
+++ b/third_party/blink/renderer/platform/scroll/scroll_animator_test.cc
@@ -70,6 +70,7 @@
 
   MOCK_CONST_METHOD0(VisualRectForScrollbarParts, LayoutRect());
   MOCK_CONST_METHOD0(IsActive, bool());
+  MOCK_CONST_METHOD0(IsThrottled, bool());
   MOCK_CONST_METHOD1(ScrollSize, int(ScrollbarOrientation));
   MOCK_CONST_METHOD0(IsScrollCornerVisible, bool());
   MOCK_CONST_METHOD0(ScrollCornerRect, IntRect());
diff --git a/third_party/blink/renderer/platform/scroll/scroll_snap_data.h b/third_party/blink/renderer/platform/scroll/scroll_snap_data.h
index 6cc9550..0aa5294 100644
--- a/third_party/blink/renderer/platform/scroll/scroll_snap_data.h
+++ b/third_party/blink/renderer/platform/scroll/scroll_snap_data.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCROLL_SCROLL_SNAP_DATA_H_
 
 #include "cc/input/scroll_snap_data.h"
+#include "cc/input/snap_fling_controller.h"
 
 // This file defines classes and structs used in SnapCoordinator.h
 
@@ -19,6 +20,8 @@
 using ScrollSnapAlign = cc::ScrollSnapAlign;
 using SnapAreaData = cc::SnapAreaData;
 using SnapContainerData = cc::SnapContainerData;
+using SnapFlingController = cc::SnapFlingController;
+using SnapFlingClient = cc::SnapFlingClient;
 
 }  // namespace blink
 
diff --git a/third_party/blink/renderer/platform/scroll/scrollable_area.h b/third_party/blink/renderer/platform/scroll/scrollable_area.h
index e03f77ba..87b60bc 100644
--- a/third_party/blink/renderer/platform/scroll/scrollable_area.h
+++ b/third_party/blink/renderer/platform/scroll/scrollable_area.h
@@ -172,6 +172,10 @@
   }
 
   virtual bool IsActive() const = 0;
+  // Returns true if the frame this ScrollableArea is attached to is being
+  // throttled for lifecycle updates. In this case it should also not be
+  // painted.
+  virtual bool IsThrottled() const = 0;
   virtual int ScrollSize(ScrollbarOrientation) const = 0;
   void SetScrollbarNeedsPaintInvalidation(ScrollbarOrientation);
   virtual bool IsScrollCornerVisible() const = 0;
diff --git a/third_party/blink/renderer/platform/scroll/scrollbar_layer_delegate.cc b/third_party/blink/renderer/platform/scroll/scrollbar_layer_delegate.cc
index f76dcf5..041a370 100644
--- a/third_party/blink/renderer/platform/scroll/scrollbar_layer_delegate.cc
+++ b/third_party/blink/renderer/platform/scroll/scrollbar_layer_delegate.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/platform/graphics/paint/paint_canvas.h"
 #include "third_party/blink/renderer/platform/graphics/paint/paint_record_builder.h"
 #include "third_party/blink/renderer/platform/scroll/scroll_types.h"
+#include "third_party/blink/renderer/platform/scroll/scrollable_area.h"
 #include "third_party/blink/renderer/platform/scroll/scrollbar.h"
 #include "third_party/blink/renderer/platform/scroll/scrollbar_theme.h"
 #include "ui/gfx/skia_util.h"
@@ -108,6 +109,12 @@
 }
 
 bool ScrollbarLayerDelegate::HasTickmarks() const {
+  // When the frame is throttled, the scrollbar will not be painted because
+  // the frame has not had its lifecycle updated. Thus the actual value of
+  // HasTickmarks can't be known and may change once the frame is unthrottled.
+  if (scrollbar_->GetScrollableArea()->IsThrottled())
+    return false;
+
   Vector<IntRect> tickmarks;
   scrollbar_->GetTickmarks(tickmarks);
   return !tickmarks.IsEmpty();
@@ -119,6 +126,9 @@
   PaintCanvasAutoRestore auto_restore(canvas, true);
   blink::Scrollbar& scrollbar = *scrollbar_;
 
+  if (scrollbar.GetScrollableArea()->IsThrottled())
+    return;
+
   if (part == cc::THUMB) {
     ScopedScrollbarPainter painter(*canvas, device_scale_factor_);
     theme_.PaintThumb(painter.Context(), scrollbar, IntRect(content_rect));
diff --git a/third_party/blink/renderer/platform/scroll/scrollbar_test_suite.h b/third_party/blink/renderer/platform/scroll/scrollbar_test_suite.h
index 12547dd5..60224eb 100644
--- a/third_party/blink/renderer/platform/scroll/scrollbar_test_suite.h
+++ b/third_party/blink/renderer/platform/scroll/scrollbar_test_suite.h
@@ -49,6 +49,7 @@
 
   MOCK_CONST_METHOD0(VisualRectForScrollbarParts, LayoutRect());
   MOCK_CONST_METHOD0(IsActive, bool());
+  MOCK_CONST_METHOD0(IsThrottled, bool());
   MOCK_CONST_METHOD1(ScrollSize, int(ScrollbarOrientation));
   MOCK_CONST_METHOD0(IsScrollCornerVisible, bool());
   MOCK_CONST_METHOD0(ScrollCornerRect, IntRect());
diff --git a/third_party/blink/renderer/platform/testing/DEPS b/third_party/blink/renderer/platform/testing/DEPS
index c846849..318945f 100644
--- a/third_party/blink/renderer/platform/testing/DEPS
+++ b/third_party/blink/renderer/platform/testing/DEPS
@@ -17,7 +17,7 @@
     "+base/test/test_io_thread.h",
     "+cc",
     "+components/viz/test",
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
     '+testing',
 
     "+third_party/blink/renderer/platform/font_family_names.h",
diff --git a/third_party/blink/renderer/platform/testing/image_decode_bench.cc b/third_party/blink/renderer/platform/testing/image_decode_bench.cc
index 6860cf8b..00c158d 100644
--- a/third_party/blink/renderer/platform/testing/image_decode_bench.cc
+++ b/third_party/blink/renderer/platform/testing/image_decode_bench.cc
@@ -21,7 +21,7 @@
 #include "base/command_line.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/message_loop/message_loop.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/platform/image-decoders/image_decoder.h"
 #include "third_party/blink/renderer/platform/shared_buffer.h"
@@ -157,6 +157,6 @@
 
 int main(int argc, char* argv[]) {
   base::MessageLoop message_loop;
-  mojo::edk::Init();
+  mojo::core::Init();
   return blink::ImageDecodeBenchMain(argc, argv);
 }
diff --git a/third_party/blink/renderer/platform/testing/run_all_tests.cc b/third_party/blink/renderer/platform/testing/run_all_tests.cc
index ce8e4d8..8b7ea4b 100644
--- a/third_party/blink/renderer/platform/testing/run_all_tests.cc
+++ b/third_party/blink/renderer/platform/testing/run_all_tests.cc
@@ -33,8 +33,8 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_io_thread.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "third_party/blink/renderer/platform/heap/heap.h"
 #include "third_party/blink/renderer/platform/testing/testing_platform_support.h"
 
@@ -54,11 +54,11 @@
   {
     base::TestSuite testSuite(argc, argv);
 
-    mojo::edk::Init();
+    mojo::core::Init();
     base::TestIOThread testIoThread(base::TestIOThread::kAutoStart);
-    mojo::edk::ScopedIPCSupport ipcSupport(
+    mojo::core::ScopedIPCSupport ipcSupport(
         testIoThread.task_runner(),
-        mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+        mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
     result = base::LaunchUnitTests(
         argc, argv, base::BindOnce(runTestSuite, base::Unretained(&testSuite)));
   }
diff --git a/third_party/blink/renderer/platform/wtf/list_hash_set.h b/third_party/blink/renderer/platform/wtf/list_hash_set.h
index 610bdff1..236fb65 100644
--- a/third_party/blink/renderer/platform/wtf/list_hash_set.h
+++ b/third_party/blink/renderer/platform/wtf/list_hash_set.h
@@ -246,7 +246,6 @@
   void CreateAllocatorIfNeeded() {
     allocator_provider_.CreateAllocatorIfNeeded();
   }
-  void Deallocate(Node* node) const { allocator_provider_.deallocate(node); }
 
   iterator MakeIterator(Node* position) { return iterator(this, position); }
   const_iterator MakeConstIterator(Node* position) const {
@@ -311,11 +310,6 @@
       std::swap(allocator_, other.allocator_);
     }
 
-    void Deallocate(Node* node) const {
-      DCHECK(allocator_);
-      allocator_->Deallocate(node);
-    }
-
     ListHashSetAllocator* Get() const {
       DCHECK(allocator_);
       return allocator_;
diff --git a/third_party/blink/tools/audit_non_blink_usage.py b/third_party/blink/tools/audit_non_blink_usage.py
index 189c6b8..2f15db5 100755
--- a/third_party/blink/tools/audit_non_blink_usage.py
+++ b/third_party/blink/tools/audit_non_blink_usage.py
@@ -146,6 +146,7 @@
             'gfx::Size',
             'gfx::SizeF',
             'gfx::Transform',
+            'gfx::Vector2dF',
             # Wrapper of SkRegion used in Chromium.
             'cc::Region',
 
@@ -445,6 +446,7 @@
     # Only check code. Ignore tests.
     # TODO(tkent): Remove 'Test' after the great mv.
     if (ext not in ('.cc', '.cpp', '.h', '.mm')
+            or path.find('/testing/') >= 0
             or basename.endswith('Test')
             or basename.endswith('_test')
             or basename.endswith('_test_helpers')
diff --git a/third_party/libaddressinput/BUILD.gn b/third_party/libaddressinput/BUILD.gn
index 86d81fe..f540dee 100644
--- a/third_party/libaddressinput/BUILD.gn
+++ b/third_party/libaddressinput/BUILD.gn
@@ -244,7 +244,7 @@
     ":test_support",
     "//base/test:run_all_unittests",
     "//components/prefs",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net:test_support",
     "//services/network:test_support",
     "//testing/gtest",
diff --git a/third_party/libaddressinput/chromium/DEPS b/third_party/libaddressinput/chromium/DEPS
index 458fe0e..9560739b 100644
--- a/third_party/libaddressinput/chromium/DEPS
+++ b/third_party/libaddressinput/chromium/DEPS
@@ -11,7 +11,7 @@
 
 specific_include_rules = {
   "chrome_metadata_source_unittest.cc": [
-    "+mojo/edk",
+    "+mojo/core/embedder",
 ],
 }
         
diff --git a/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc b/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc
index 4576f24..faa5f03a 100644
--- a/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc
+++ b/third_party/libaddressinput/chromium/chrome_metadata_source_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
 #include "services/network/test/test_url_loader_factory.h"
@@ -25,7 +25,7 @@
             base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
                 &test_url_loader_factory_)),
         success_(false) {
-    mojo::edk::Init();
+    mojo::core::Init();
   }
   virtual ~ChromeMetadataSourceTest() {}
 
diff --git a/tools/ipc_fuzzer/message_replay/BUILD.gn b/tools/ipc_fuzzer/message_replay/BUILD.gn
index caa50384..824efe1b 100644
--- a/tools/ipc_fuzzer/message_replay/BUILD.gn
+++ b/tools/ipc_fuzzer/message_replay/BUILD.gn
@@ -5,7 +5,7 @@
 executable("ipc_fuzzer_replay") {
   configs += [ "//tools/ipc_fuzzer:ipc_fuzzer_tool_config" ]
   deps = [
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//tools/ipc_fuzzer/message_lib:ipc_message_lib",
   ]
   public_deps = [
diff --git a/tools/ipc_fuzzer/message_replay/DEPS b/tools/ipc_fuzzer/message_replay/DEPS
index 284d9520..f69c943 100644
--- a/tools/ipc_fuzzer/message_replay/DEPS
+++ b/tools/ipc_fuzzer/message_replay/DEPS
@@ -1,7 +1,7 @@
 include_rules = [
   "+chrome/common",
   "+content/public/common",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+mojo/public",
   "+services/service_manager/embedder",
 ]
diff --git a/tools/ipc_fuzzer/message_replay/replay_process.cc b/tools/ipc_fuzzer/message_replay/replay_process.cc
index f25f29f..7db44ea9 100644
--- a/tools/ipc_fuzzer/message_replay/replay_process.cc
+++ b/tools/ipc_fuzzer/message_replay/replay_process.cc
@@ -21,9 +21,9 @@
 #include "content/public/common/service_manager_connection.h"
 #include "ipc/ipc.mojom.h"
 #include "ipc/ipc_channel_mojo.h"
-#include "mojo/edk/embedder/configuration.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/configuration.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "mojo/public/cpp/platform/platform_channel.h"
 #include "mojo/public/cpp/platform/platform_channel_endpoint.h"
 #include "mojo/public/cpp/system/invitation.h"
@@ -64,9 +64,9 @@
 }  // namespace
 
 void InitializeMojo() {
-  mojo::edk::Configuration config;
+  mojo::core::Configuration config;
   config.max_message_num_bytes = 64 * 1024 * 1024;
-  mojo::edk::Init(config);
+  mojo::core::Init(config);
 }
 
 mojo::IncomingInvitation InitializeMojoIPCChannel() {
@@ -128,9 +128,9 @@
                  base::GlobalDescriptors::kBaseDescriptor);
 #endif
 
-  mojo_ipc_support_.reset(new mojo::edk::ScopedIPCSupport(
+  mojo_ipc_support_.reset(new mojo::core::ScopedIPCSupport(
       io_thread_.task_runner(),
-      mojo::edk::ScopedIPCSupport::ShutdownPolicy::FAST));
+      mojo::core::ScopedIPCSupport::ShutdownPolicy::FAST));
   mojo_invitation_ =
       std::make_unique<mojo::IncomingInvitation>(InitializeMojoIPCChannel());
 
diff --git a/tools/ipc_fuzzer/message_replay/replay_process.h b/tools/ipc_fuzzer/message_replay/replay_process.h
index 4ac141a..3fad8fc 100644
--- a/tools/ipc_fuzzer/message_replay/replay_process.h
+++ b/tools/ipc_fuzzer/message_replay/replay_process.h
@@ -25,9 +25,9 @@
 
 namespace mojo {
 class IncomingInvitation;
-namespace edk {
+namespace core {
 class ScopedIPCSupport;
-}  // namespace edk
+}  // namespace core
 }  // namespace mojo
 
 namespace ipc_fuzzer {
@@ -58,7 +58,7 @@
  private:
   void SendNextMessage();
 
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> mojo_ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> mojo_ipc_support_;
   std::unique_ptr<mojo::IncomingInvitation> mojo_invitation_;
   std::unique_ptr<content::ServiceManagerConnection>
       service_manager_connection_;
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 1e4b3b2..1781c31 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -29797,7 +29797,7 @@
   <int value="161" label="width"/>
   <int value="162" label="word-break"/>
   <int value="163" label="word-spacing"/>
-  <int value="164" label="word-wrap"/>
+  <int value="164" label="alias-word-wrap"/>
   <int value="165" label="z-index"/>
   <int value="166" label="alias-webkit-animation"/>
   <int value="167" label="alias-webkit-animation-delay"/>
@@ -31380,6 +31380,13 @@
   <int value="1" label="Intent for new page load"/>
 </enum>
 
+<enum name="MobileStartupToolbarFirstFocusStartupState">
+  <int value="0" label="Before native initialization complete"/>
+  <int value="1" label="After native initialization complete"/>
+  <int value="2" label="After first meaningful paint"/>
+  <int value="3" label="After first pageload finished"/>
+</enum>
+
 <enum name="ModuleBlacklistCacheReadResult">
   <int value="0" label="Success"/>
   <int value="1" label="Failed to open the file"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index cd62164..dfac0f0 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -7212,7 +7212,7 @@
 </histogram>
 
 <histogram name="BackgroundMode.OnStartup.AutoLaunchState"
-    enum="AutoLaunchState">
+    enum="AutoLaunchState" expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     Logged during BackgroundModeManager's initialization. Indicates the
@@ -7221,7 +7221,7 @@
 </histogram>
 
 <histogram name="BackgroundMode.OnStartup.IsBackgroundModePrefEnabled"
-    enum="BooleanEnabled">
+    enum="BooleanEnabled" expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     Logged during BackgroundModeManager's initialization. Indicates the state of
@@ -8321,6 +8321,13 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.ResourceFetcher.StaleWhileRevalidate"
+    enum="BooleanAttempted" expires_after="M71">
+  <owner>dtapuska@chromium.org</owner>
+  <owner>kenjibaheux@google.com</owner>
+  <summary>Count of resources attempted Stale Revalidation.</summary>
+</histogram>
+
 <histogram base="true" name="Blink.ResourceLoadScheduler.DecodedBytes"
     units="bytes">
 <!-- Name completed by histogram_suffixes name="ResourceLoadScheduler.FrameType" -->
@@ -10955,7 +10962,8 @@
   </summary>
 </histogram>
 
-<histogram name="Chrome.ProcessSingleton.NotifyResult" enum="NotifyResult">
+<histogram name="Chrome.ProcessSingleton.NotifyResult" enum="NotifyResult"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     The result of every rendez-vous reported once per browser process launch.
@@ -11031,7 +11039,8 @@
   </summary>
 </histogram>
 
-<histogram name="Chrome.ProcessSingleton.TimeToCreate" units="ms">
+<histogram name="Chrome.ProcessSingleton.TimeToCreate" units="ms"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     Time it takes to grab the process singleton. Reported once per successful
@@ -11039,7 +11048,8 @@
   </summary>
 </histogram>
 
-<histogram name="Chrome.ProcessSingleton.TimeToFailure" units="ms">
+<histogram name="Chrome.ProcessSingleton.TimeToFailure" units="ms"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     Time it takes to return an error from the process singleton algorithm (nor
@@ -11048,7 +11058,8 @@
   </summary>
 </histogram>
 
-<histogram name="Chrome.ProcessSingleton.TimeToNotify" units="ms">
+<histogram name="Chrome.ProcessSingleton.TimeToNotify" units="ms"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     Time it takes to find the process singleton owner and notify it. Reported
@@ -31415,7 +31426,8 @@
   </summary>
 </histogram>
 
-<histogram name="GoogleUpdate.EffectivePolicy" enum="UpdatePolicy">
+<histogram name="GoogleUpdate.EffectivePolicy" enum="UpdatePolicy"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     The effective update policy for Chrome on Windows. Recorded once per startup
@@ -33304,7 +33316,8 @@
   </summary>
 </histogram>
 
-<histogram name="History.InMemoryDBKeywordTermsPopulate" units="ms">
+<histogram name="History.InMemoryDBKeywordTermsPopulate" units="ms"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     Time to load in-memory keyword_search_terms table from disk. Recorded on
@@ -33319,7 +33332,8 @@
   </summary>
 </histogram>
 
-<histogram name="History.InMemoryDBKeywordURLPopulate" units="ms">
+<histogram name="History.InMemoryDBKeywordURLPopulate" units="ms"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     Time to load in-memory urls table from disk urls table. Recorded on profile
@@ -34014,7 +34028,8 @@
   </summary>
 </histogram>
 
-<histogram name="Import.ImporterType.AutoImport" enum="ImporterType">
+<histogram name="Import.ImporterType.AutoImport" enum="ImporterType"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>The importer used on first run Auto Import.</summary>
 </histogram>
@@ -34024,7 +34039,8 @@
   <summary>The importer used on import from the bookmarks file API.</summary>
 </histogram>
 
-<histogram name="Import.ImporterType.ImportDataHandler" enum="ImporterType">
+<histogram name="Import.ImporterType.ImportDataHandler" enum="ImporterType"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     The importer used on import from the chrome://settings/importData UI.
@@ -45085,6 +45101,16 @@
   </summary>
 </histogram>
 
+<histogram base="true" name="MobileStartup.ToolbarFirstFocusStartupState"
+    enum="MobileStartupToolbarFirstFocusStartupState">
+  <owner>mheikal@chromium.org</owner>
+  <summary>
+    Android: The state of chrome startup at the first time the user focuses the
+    omnibox, if the user does so within the first 30s of the launch (excluding
+    activity creation time spent in the framework).
+  </summary>
+</histogram>
+
 <histogram base="true" name="MobileStartup.ToolbarFirstFocusTime" units="ms">
   <obsolete>
     Deprecated and renamed to MobileStartup.ToolbarFirstFocusTime2 due to double
@@ -73842,7 +73868,7 @@
   <summary>The time spent to load a PPAPI plugin.</summary>
 </histogram>
 
-<histogram name="Plugin.PpapiSyncIPCTime" units="ms">
+<histogram name="Plugin.PpapiSyncIPCTime" units="ms" expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     The time it took to complete a synchronous IPC made from the PPAPI process.
@@ -84808,7 +84834,8 @@
   </summary>
 </histogram>
 
-<histogram name="SBClientPhishing.DOMFeatureResumeTime" units="ms">
+<histogram name="SBClientPhishing.DOMFeatureResumeTime" units="ms"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     The time that it took to resume DOM feature extraction for the phishing
@@ -85690,6 +85717,27 @@
   </summary>
 </histogram>
 
+<histogram name="Scheduling.Browser.CommitInterval2" units="microseconds">
+  <obsolete>
+    Deprecated in 06/2018, M69, due to too much noise in the collected data.
+  </obsolete>
+  <owner>brianderson@chromium.org</owner>
+  <summary>
+    The time delta between the *draw* times of back-to-back BeginMainFrames that
+    result in a commit.
+
+    The interval is only recorded when the BeginMainFrames are running and
+    committing continuously, where continuously means when another
+    BeginMainFrame is requested by the next BeginImplFrame after activation.
+
+    Warning: This metric may include reports from clients with low-resolution
+    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+    will cause this metric to have an abnormal distribution. When considering
+    revising this histogram, see UMA_HISTOGRAM_CUSTOM_HIGH_RESOLUTION_TIMES for
+    the solution.
+  </summary>
+</histogram>
+
 <histogram name="Scheduling.Browser.DrawInterval2" units="microseconds">
   <obsolete>
     Deprecated in 06/2018, M69, due to too much noise in the collected data.
@@ -85724,24 +85772,6 @@
   </summary>
 </histogram>
 
-<histogram name="Scheduling.CommitInterval2" units="microseconds">
-  <owner>brianderson@chromium.org</owner>
-  <summary>
-    The time delta between the *draw* times of back-to-back BeginMainFrames that
-    result in a commit.
-
-    The interval is only recorded when the BeginMainFrames are running and
-    committing continuously, where continuously means when another
-    BeginMainFrame is requested by the next BeginImplFrame after activation.
-
-    Warning: This metric may include reports from clients with low-resolution
-    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
-    will cause this metric to have an abnormal distribution. When considering
-    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
-    solution.
-  </summary>
-</histogram>
-
 <histogram name="Scheduling.CommitToReadyToActivateDuration"
     units="microseconds">
   <obsolete>
@@ -86016,6 +86046,24 @@
   </summary>
 </histogram>
 
+<histogram name="Scheduling.Renderer.CommitInterval2" units="microseconds">
+  <owner>brianderson@chromium.org</owner>
+  <summary>
+    The time delta between the *draw* times of back-to-back BeginMainFrames that
+    result in a commit.
+
+    The interval is only recorded when the BeginMainFrames are running and
+    committing continuously, where continuously means when another
+    BeginMainFrame is requested by the next BeginImplFrame after activation.
+
+    Warning: This metric may include reports from clients with low-resolution
+    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+    will cause this metric to have an abnormal distribution. When considering
+    revising this histogram, see UMA_HISTOGRAM_CUSTOM_HIGH_RESOLUTION_TIMES for
+    the solution.
+  </summary>
+</histogram>
+
 <histogram name="Scheduling.Renderer.DrawInterval2" units="microseconds">
   <owner>brianderson@chromium.org</owner>
   <summary>
@@ -90547,14 +90595,16 @@
   </summary>
 </histogram>
 
-<histogram name="Settings.FilterOnLoadTime" units="ms">
+<histogram name="Settings.FilterOnLoadTime" units="ms"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     The amount of time it took to run PrefHashFilter::FilterOnLoad on startup.
   </summary>
 </histogram>
 
-<histogram name="Settings.FilterSerializeDataTime" units="ms">
+<histogram name="Settings.FilterSerializeDataTime" units="ms"
+    expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     The amount of time it took to run PrefHashFilter::FilterSerializeData on the
@@ -91064,7 +91114,7 @@
 </histogram>
 
 <histogram name="Settings.TrackedPreferencesNoEnforcementOnDomain"
-    enum="BooleanEnabled">
+    enum="BooleanEnabled" expires_after="2018-08-30">
   <owner>gab@chromium.org</owner>
   <summary>
     Whether settings enforcement was cancelled for a machine joined to a domain.
@@ -101794,6 +101844,15 @@
   </summary>
 </histogram>
 
+<histogram name="TaskQueueManager.ActiveQueuesCount">
+  <owner>altimin@chromium.org</owner>
+  <owner>farahcharab@chromium.org</owner>
+  <summary>
+    Used to track the number of active task queues in the task queue manager.
+    Reported every time a task is selected for execution.
+  </summary>
+</histogram>
+
 <histogram name="TaskQueueSelector.TaskServicedPerSelectorLogic"
     enum="TaskQueueSelectorLogic">
   <owner>altimin@chromium.org</owner>
@@ -114786,6 +114845,7 @@
              Android"/>
   <affected-histogram name="MobileStartup.ToolbarFirstDrawTime"/>
   <affected-histogram name="MobileStartup.ToolbarFirstDrawTime2"/>
+  <affected-histogram name="MobileStartup.ToolbarFirstFocusStartupState"/>
   <affected-histogram name="MobileStartup.ToolbarFirstFocusTime"/>
   <affected-histogram name="MobileStartup.ToolbarFirstFocusTime2"/>
   <affected-histogram name="MobileStartup.ToolbarInflationTime"/>
@@ -114885,7 +114945,6 @@
   <affected-histogram
       name="Scheduling.BeginMainFrameQueueDurationNotCritical2"/>
   <affected-histogram name="Scheduling.BeginMainFrameStartToCommitDuration2"/>
-  <affected-histogram name="Scheduling.CommitInterval2"/>
   <affected-histogram name="Scheduling.CommitToReadyToActivateDuration2"/>
   <affected-histogram name="Scheduling.DrawDuration2"/>
   <affected-histogram name="Scheduling.DrawIntervalWithCompositedAnimations2"/>
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index e89ccaa..6548b0b 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -1065,14 +1065,14 @@
     },
     'Win 7 Nvidia GPU Perf': {
       'tests': [
-        {
-          'isolate': 'performance_test_suite',
-          'num_shards': 5,
-          'extra_args': [
-              '--run-ref-build',
-              '--test-shard-map-filename=win7_nvidia_shard_map.json',
-          ],
-        },
+        #{
+        #  'isolate': 'performance_test_suite',
+        #  'num_shards': 5,
+        #  'extra_args': [
+        #      '--run-ref-build',
+        #      '--test-shard-map-filename=win7_nvidia_shard_map.json',
+        #  ],
+        #},
         # crbug.com/735679 enable performance_browser_tests
         {
           'isolate': 'load_library_perf_tests',
diff --git a/tools/v8_context_snapshot/BUILD.gn b/tools/v8_context_snapshot/BUILD.gn
index b9254d9..b119ec0 100644
--- a/tools/v8_context_snapshot/BUILD.gn
+++ b/tools/v8_context_snapshot/BUILD.gn
@@ -100,7 +100,7 @@
 
     deps = [
       "//gin:gin",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//services/service_manager/public/cpp",
       "//third_party/blink/public:blink",
       "//v8",
diff --git a/tools/v8_context_snapshot/DEPS b/tools/v8_context_snapshot/DEPS
index b62570d..581e8232 100644
--- a/tools/v8_context_snapshot/DEPS
+++ b/tools/v8_context_snapshot/DEPS
@@ -3,6 +3,6 @@
   "+v8",
   "+third_party/blink/public",
   "+gin/v8_initializer.h",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+services/service_manager/public",
 ]
diff --git a/tools/v8_context_snapshot/v8_context_snapshot_generator.cc b/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
index 3a8f3d9..43805201 100644
--- a/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
+++ b/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
@@ -10,7 +10,7 @@
 #include "base/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "gin/v8_initializer.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "third_party/blink/public/platform/web_thread.h"
 #include "third_party/blink/public/web/blink.h"
@@ -55,7 +55,7 @@
   // Set up environment to make Blink and V8 workable.
   base::MessageLoop message_loop;
   base::TaskScheduler::CreateAndStartWithDefaultParams("TakeSnapshot");
-  mojo::edk::Init();
+  mojo::core::Init();
 
   // Take a snapshot.
   SnapshotPlatform platform;
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn
index ccd6833a..d96ec3b 100644
--- a/ui/accessibility/BUILD.gn
+++ b/ui/accessibility/BUILD.gn
@@ -215,8 +215,8 @@
     ":test_support",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
-    "//mojo/edk/test:test_support",
+    "//mojo/core/embedder",
+    "//mojo/core/test:test_support",
     "//mojo/public/cpp/test_support:test_utils",
     "//skia",
     "//testing/gtest",
diff --git a/ui/accessibility/DEPS b/ui/accessibility/DEPS
index ab5cea7..605f104 100644
--- a/ui/accessibility/DEPS
+++ b/ui/accessibility/DEPS
@@ -12,7 +12,7 @@
 
 specific_include_rules = {
   "run_all_unittests.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ],
   "ax_assistant_util.h": [
     "+ui/accessibility/mojom",
diff --git a/ui/accessibility/run_all_unittests.cc b/ui/accessibility/run_all_unittests.cc
index 3cdbe27..ae25b612a78 100644
--- a/ui/accessibility/run_all_unittests.cc
+++ b/ui/accessibility/run_all_unittests.cc
@@ -6,10 +6,10 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 
 int main(int argc, char** argv) {
-  mojo::edk::Init();
+  mojo::core::Init();
 
   base::TestSuite test_suite(argc, argv);
   return base::LaunchUnitTests(
diff --git a/ui/aura/BUILD.gn b/ui/aura/BUILD.gn
index 9d09a03..ef79ede 100644
--- a/ui/aura/BUILD.gn
+++ b/ui/aura/BUILD.gn
@@ -401,7 +401,7 @@
     "//base/test:test_support",
     "//cc/mojo_embedder",
     "//components/viz/client",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net",
     "//services/ui/common:task_runner_test_base",
     "//services/ui/public/cpp",
diff --git a/ui/aura/test/DEPS b/ui/aura/test/DEPS
index 87323269..7b065fa 100644
--- a/ui/aura/test/DEPS
+++ b/ui/aura/test/DEPS
@@ -1,7 +1,7 @@
 include_rules = [
   "+cc/test",
   "+components/viz/test",
-  "+mojo/edk/embedder/embedder.h",
+  "+mojo/core/embedder/embedder.h",
   "+services/ui/public/cpp/input_devices",
   "+ui/gl",
   "+ui/wm/core/wm_state.h",
diff --git a/ui/aura/test/run_all_unittests.cc b/ui/aura/test/run_all_unittests.cc
index f167887..fc1f8a3 100644
--- a/ui/aura/test/run_all_unittests.cc
+++ b/ui/aura/test/run_all_unittests.cc
@@ -6,7 +6,7 @@
 #include "base/macros.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/aura/env.h"
 #include "ui/aura/test/aura_test_suite.h"
 #include "ui/gl/gl_surface.h"
@@ -62,7 +62,7 @@
 int main(int argc, char** argv) {
   AuraTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
   return base::LaunchUnitTests(
       argc, argv,
       base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn
index bbba60a..7798561 100644
--- a/ui/base/BUILD.gn
+++ b/ui/base/BUILD.gn
@@ -921,7 +921,7 @@
     ":ui_base_unittests_bundle_data",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//net",
     "//net:test_support",
     "//skia",
diff --git a/ui/base/test/DEPS b/ui/base/test/DEPS
index da738ce..b5f2b17 100644
--- a/ui/base/test/DEPS
+++ b/ui/base/test/DEPS
@@ -1,5 +1,5 @@
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ],
 }
diff --git a/ui/base/test/run_all_unittests.cc b/ui/base/test/run_all_unittests.cc
index c7b785a0..7ba08a5 100644
--- a/ui/base/test/run_all_unittests.cc
+++ b/ui/base/test/run_all_unittests.cc
@@ -9,7 +9,7 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
 
@@ -98,7 +98,7 @@
 int main(int argc, char** argv) {
   UIBaseTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
   return base::LaunchUnitTests(
       argc, argv,
       base::BindOnce(&UIBaseTestSuite::Run, base::Unretained(&test_suite)));
diff --git a/ui/chromeos/BUILD.gn b/ui/chromeos/BUILD.gn
index 913671f..6b8115d 100644
--- a/ui/chromeos/BUILD.gn
+++ b/ui/chromeos/BUILD.gn
@@ -69,7 +69,7 @@
     ":chromeos",
     "//base/test:test_support",
     "//chromeos",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//skia",
     "//testing/gtest",
     "//ui/aura:test_support",
diff --git a/ui/chromeos/DEPS b/ui/chromeos/DEPS
index 2f1a2a14..e70987f 100644
--- a/ui/chromeos/DEPS
+++ b/ui/chromeos/DEPS
@@ -24,6 +24,6 @@
 
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ]
 }
diff --git a/ui/chromeos/run_all_unittests.cc b/ui/chromeos/run_all_unittests.cc
index ac528c40..bc4c83cd 100644
--- a/ui/chromeos/run_all_unittests.cc
+++ b/ui/chromeos/run_all_unittests.cc
@@ -10,7 +10,7 @@
 #include "base/path_service.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/env.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -53,7 +53,7 @@
 int main(int argc, char** argv) {
   UIChromeOSTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(
       argc, argv,
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn
index 3f4eb3e9..7c3764bb 100644
--- a/ui/compositor/BUILD.gn
+++ b/ui/compositor/BUILD.gn
@@ -222,7 +222,7 @@
     "//components/viz/common",
     "//components/viz/service",
     "//components/viz/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//skia",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/ui/compositor/DEPS b/ui/compositor/DEPS
index 753ceb7..1060fa2a 100644
--- a/ui/compositor/DEPS
+++ b/ui/compositor/DEPS
@@ -16,7 +16,7 @@
 
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ],
   ".*_(unit|pixel|perf)test.*\.cc": [
     "+components/viz/test",
diff --git a/ui/compositor/layer_animation_element.cc b/ui/compositor/layer_animation_element.cc
index ff58e2c4..3d965dd 100644
--- a/ui/compositor/layer_animation_element.cc
+++ b/ui/compositor/layer_animation_element.cc
@@ -294,11 +294,26 @@
   bool OnProgress(double t, LayerAnimationDelegate* delegate) override {
     if (t < 1.0)
       return false;
+
+    if (Started() && IsThreaded(delegate)) {
+      LayerThreadedAnimationDelegate* threaded =
+          delegate->GetThreadedAnimationDelegate();
+      DCHECK(threaded);
+      threaded->RemoveThreadedAnimation(keyframe_model_id());
+    }
+
     OnEnd(delegate);
     return true;
   }
 
-  void OnAbort(LayerAnimationDelegate* delegate) override = 0;
+  void OnAbort(LayerAnimationDelegate* delegate) override {
+    if (delegate && Started() && IsThreaded(delegate)) {
+      LayerThreadedAnimationDelegate* threaded =
+          delegate->GetThreadedAnimationDelegate();
+      DCHECK(threaded);
+      threaded->RemoveThreadedAnimation(keyframe_model_id());
+    }
+  }
 
   void RequestEffectiveStart(LayerAnimationDelegate* delegate) override {
     DCHECK(animation_group_id());
@@ -313,9 +328,7 @@
     LayerThreadedAnimationDelegate* threaded =
         delegate->GetThreadedAnimationDelegate();
     DCHECK(threaded);
-    // The removal of the added threaded keyframe models happens at the layer
-    // animation sequence level because they can only be removed all together.
-    threaded->AddThreadedKeyframeModel(std::move(keyframe_model));
+    threaded->AddThreadedAnimation(std::move(keyframe_model));
   }
 
   virtual void OnEnd(LayerAnimationDelegate* delegate) = 0;
@@ -347,6 +360,7 @@
 
   void OnAbort(LayerAnimationDelegate* delegate) override {
     if (delegate && Started()) {
+      ThreadedLayerAnimationElement::OnAbort(delegate);
       delegate->SetOpacityFromAnimation(
           gfx::Tween::FloatValueBetween(
               gfx::Tween::CalculateValue(tween_type(),
@@ -416,6 +430,7 @@
 
   void OnAbort(LayerAnimationDelegate* delegate) override {
     if (delegate && Started()) {
+      ThreadedLayerAnimationElement::OnAbort(delegate);
       delegate->SetTransformFromAnimation(
           gfx::Tween::TransformValueBetween(
               gfx::Tween::CalculateValue(tween_type(),
diff --git a/ui/compositor/layer_animation_sequence.cc b/ui/compositor/layer_animation_sequence.cc
index aedfd9e..a252a0a 100644
--- a/ui/compositor/layer_animation_sequence.cc
+++ b/ui/compositor/layer_animation_sequence.cc
@@ -13,7 +13,6 @@
 #include "ui/compositor/layer_animation_delegate.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animation_observer.h"
-#include "ui/compositor/layer_threaded_animation_delegate.h"
 
 namespace ui {
 
@@ -24,8 +23,7 @@
       waiting_for_group_start_(false),
       animation_group_id_(0),
       last_progressed_fraction_(0.0),
-      animation_metrics_reporter_(nullptr),
-      has_finished_threaded_element_(false) {}
+      animation_metrics_reporter_(nullptr) {}
 
 LayerAnimationSequence::LayerAnimationSequence(
     std::unique_ptr<LayerAnimationElement> element)
@@ -35,8 +33,7 @@
       waiting_for_group_start_(false),
       animation_group_id_(0),
       last_progressed_fraction_(0.0),
-      animation_metrics_reporter_(nullptr),
-      has_finished_threaded_element_(false) {
+      animation_metrics_reporter_(nullptr) {
   AddElement(std::move(element));
 }
 
@@ -77,26 +74,14 @@
     if (!elements_[current_index]->IsFinished(now, &element_duration))
       break;
 
-    // Check threaded state before calling ProgressToEnd because some
-    // animations, e.g. opacity, are not considered threaded once finished.
-    bool started_threaded_element =
-        elements_[current_index]->Started() && delegate &&
-        elements_[current_index]->IsThreaded(delegate);
     // Let the element we're passing finish.
-    if (elements_[current_index]->ProgressToEnd(delegate)) {
+    if (elements_[current_index]->ProgressToEnd(delegate))
       redraw_required = true;
-      has_finished_threaded_element_ |= started_threaded_element;
-    }
     last_start_ += element_duration;
     ++last_element_;
     last_progressed_fraction_ =
         elements_[current_index]->last_progressed_fraction();
     current_index = last_element_ % elements_.size();
-    // In cases that the sequence is infinite, i.e. is_cyclic_ is true, this
-    // guarantees that we clean up the finished keyframe models before adding
-    // new ones in the next round.
-    if (has_finished_threaded_element_ && current_index == 0)
-      RemoveThreadedKeyframeModels(delegate);
   }
 
   if (is_cyclic_ || last_element_ < elements_.size()) {
@@ -105,27 +90,14 @@
       elements_[current_index]->Start(delegate, animation_group_id_);
     }
     base::WeakPtr<LayerAnimationSequence> alive(AsWeakPtr());
-    bool threaded_element =
-        delegate && elements_[current_index]->IsThreaded(delegate);
-    if (elements_[current_index]->Progress(now, delegate)) {
+    if (elements_[current_index]->Progress(now, delegate))
       redraw_required = true;
-      // The sequence may be destructed during the Progress call above therefore
-      // we only update its member while it's still *alive*, i.e. in memory.
-      if (alive)
-        has_finished_threaded_element_ |= threaded_element;
-    }
     if (!alive)
       return;
     last_progressed_fraction_ =
         elements_[current_index]->last_progressed_fraction();
   }
 
-  // We remove the threaded keyframe models after iterating the finite sequence.
-  // This is to make sure that we don't remove any unfinished trailing threaded
-  // keyframe models.
-  if (has_finished_threaded_element_ && last_element_ % elements_.size() == 0)
-    RemoveThreadedKeyframeModels(delegate);
-
   // Since the delegate may be deleted due to the notifications below, it is
   // important that we schedule a draw before sending them.
   if (redraw_required)
@@ -172,21 +144,14 @@
 
   size_t current_index = last_element_ % elements_.size();
   while (current_index < elements_.size()) {
-    bool threaded_element =
-        delegate && elements_[current_index]->IsThreaded(delegate);
-    if (elements_[current_index]->ProgressToEnd(delegate)) {
+    if (elements_[current_index]->ProgressToEnd(delegate))
       redraw_required = true;
-      has_finished_threaded_element_ |= threaded_element;
-    }
     last_progressed_fraction_ =
         elements_[current_index]->last_progressed_fraction();
     ++current_index;
     ++last_element_;
   }
 
-  if (has_finished_threaded_element_)
-    RemoveThreadedKeyframeModels(delegate);
-
   if (redraw_required)
     delegate->ScheduleDrawForAnimation();
 
@@ -215,8 +180,6 @@
   }
   last_element_ = 0;
   waiting_for_group_start_ = false;
-  if (HasThreadedElement(delegate))
-    RemoveThreadedKeyframeModels(delegate);
   NotifyAborted();
 }
 
@@ -329,29 +292,6 @@
   return elements_[current_index].get();
 }
 
-bool LayerAnimationSequence::HasThreadedElement(
-    LayerAnimationDelegate* delegate) const {
-  if (!delegate)
-    return false;
-
-  return any_of(elements_.begin(), elements_.end(), [=](const auto& element) {
-    return element->IsThreaded(delegate);
-  });
-}
-
-void LayerAnimationSequence::RemoveThreadedKeyframeModels(
-    LayerAnimationDelegate* delegate) {
-  if (!delegate)
-    return;
-
-  LayerThreadedAnimationDelegate* threaded =
-      delegate->GetThreadedAnimationDelegate();
-  DCHECK(threaded);
-  threaded->RemoveThreadedKeyframeModels();
-
-  has_finished_threaded_element_ = false;
-}
-
 std::string LayerAnimationSequence::ElementsToString() const {
   std::string str;
   for (size_t i = 0; i < elements_.size(); i++) {
diff --git a/ui/compositor/layer_animation_sequence.h b/ui/compositor/layer_animation_sequence.h
index 27debad..0629c571 100644
--- a/ui/compositor/layer_animation_sequence.h
+++ b/ui/compositor/layer_animation_sequence.h
@@ -165,13 +165,6 @@
   // The currently animating element.
   LayerAnimationElement* CurrentElement() const;
 
-  // True if the sequence contains any element that runs on the compositor.
-  bool HasThreadedElement(LayerAnimationDelegate* delegate) const;
-
-  // Removes all the threaded keyframe models associated with the sequence from
-  // cc.
-  void RemoveThreadedKeyframeModels(LayerAnimationDelegate* delegate);
-
   // The union of all the properties modified by all elements in the sequence.
   LayerAnimationElement::AnimatableProperties properties_;
 
@@ -208,9 +201,6 @@
   // Used to tag animation elements to obtain metrics of animation performance.
   AnimationMetricsReporter* animation_metrics_reporter_;
 
-  // True if the sequence has finished threaded element.
-  bool has_finished_threaded_element_;
-
   DISALLOW_COPY_AND_ASSIGN(LayerAnimationSequence);
 };
 
diff --git a/ui/compositor/layer_animator.cc b/ui/compositor/layer_animator.cc
index 30df94f..5809b9d 100644
--- a/ui/compositor/layer_animator.cc
+++ b/ui/compositor/layer_animator.cc
@@ -182,13 +182,13 @@
     animation_->DetachElement();
 }
 
-void LayerAnimator::AddThreadedKeyframeModel(
-    std::unique_ptr<cc::KeyframeModel> keyframe_model) {
-  animation_->AddKeyframeModel(std::move(keyframe_model));
+void LayerAnimator::AddThreadedAnimation(
+    std::unique_ptr<cc::KeyframeModel> animation) {
+  animation_->AddKeyframeModel(std::move(animation));
 }
 
-void LayerAnimator::RemoveThreadedKeyframeModels() {
-  animation_->RemoveKeyframeModels();
+void LayerAnimator::RemoveThreadedAnimation(int keyframe_model_id) {
+  animation_->RemoveKeyframeModel(keyframe_model_id);
 }
 
 cc::SingleKeyframeEffectAnimation* LayerAnimator::GetAnimationForTesting()
diff --git a/ui/compositor/layer_animator.h b/ui/compositor/layer_animator.h
index 8b3c9ff..9f19dce 100644
--- a/ui/compositor/layer_animator.h
+++ b/ui/compositor/layer_animator.h
@@ -371,9 +371,9 @@
       std::unique_ptr<cc::AnimationCurve> curve) override {}
 
   // Implementation of LayerThreadedAnimationDelegate.
-  void AddThreadedKeyframeModel(
+  void AddThreadedAnimation(
       std::unique_ptr<cc::KeyframeModel> keyframe_model) override;
-  void RemoveThreadedKeyframeModels() override;
+  void RemoveThreadedAnimation(int keyframe_model_id) override;
 
   void AttachLayerToAnimation(int layer_id);
   void DetachLayerFromAnimation();
diff --git a/ui/compositor/layer_animator_unittest.cc b/ui/compositor/layer_animator_unittest.cc
index d475f6a..dc64386 100644
--- a/ui/compositor/layer_animator_unittest.cc
+++ b/ui/compositor/layer_animator_unittest.cc
@@ -1670,113 +1670,6 @@
   EXPECT_FALSE(test_controller.animator()->is_animating());
 }
 
-TEST(LayerAnimatorTest, RemoveKeyframeModelsFromThreadedCyclicSequences) {
-  TestLayerAnimationDelegate delegate;
-  TestLayerThreadedAnimationDelegate* threaded_delegate =
-      static_cast<TestLayerThreadedAnimationDelegate*>(
-          delegate.GetThreadedAnimationDelegate());
-  LayerAnimatorTestController test_controller(
-      CreateDefaultTestAnimator(&delegate));
-  LayerAnimator* animator = test_controller.animator();
-
-  double start_opacity(0.0);
-  double target_opacity(1.0);
-
-  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-
-  delegate.SetOpacityFromAnimation(start_opacity,
-                                   PropertyChangeReason::NOT_FROM_ANIMATION);
-
-  LayerAnimationSequence* sequence = new LayerAnimationSequence(
-      LayerAnimationElement::CreateOpacityElement(target_opacity, delta));
-
-  sequence->AddElement(
-      LayerAnimationElement::CreateOpacityElement(start_opacity, delta));
-
-  sequence->set_is_cyclic(true);
-
-  animator->StartAnimation(sequence);
-
-  base::TimeTicks start_time = animator->last_step_time();
-  base::TimeTicks effective_start = start_time + delta;
-
-  animator->OnThreadedAnimationStarted(
-      effective_start, cc::TargetProperty::OPACITY,
-      test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
-          ->animation_group_id());
-  animator->Step(effective_start + delta);
-  EXPECT_TRUE(animator->is_animating());
-
-  // Don't remove threaded keyframe models when only part of the sequence is
-  // finished.
-  EXPECT_EQ(threaded_delegate->GetNumberOfRemoveThreadedKeyframeModelsCalls(),
-            0);
-
-  base::TimeTicks second_effective_start = effective_start + 2 * delta;
-  animator->OnThreadedAnimationStarted(
-      second_effective_start, cc::TargetProperty::OPACITY,
-      test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
-          ->animation_group_id());
-  animator->Step(second_effective_start + delta);
-  // Both threaded element are finished. Remove the keyframe models.
-  EXPECT_EQ(threaded_delegate->GetNumberOfRemoveThreadedKeyframeModelsCalls(),
-            1);
-
-  base::TimeTicks third_effective_start = second_effective_start + 2 * delta;
-  animator->OnThreadedAnimationStarted(
-      third_effective_start, cc::TargetProperty::OPACITY,
-      test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
-          ->animation_group_id());
-  // Finish both elements in one step.
-  animator->Step(third_effective_start + 2 * delta);
-  EXPECT_EQ(threaded_delegate->GetNumberOfRemoveThreadedKeyframeModelsCalls(),
-            2);
-
-  base::TimeTicks fourth_effective_start = third_effective_start + 2 * delta;
-  animator->OnThreadedAnimationStarted(
-      fourth_effective_start, cc::TargetProperty::OPACITY,
-      test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
-          ->animation_group_id());
-  animator->Step(fourth_effective_start + 1000 * delta);
-  EXPECT_EQ(threaded_delegate->GetNumberOfRemoveThreadedKeyframeModelsCalls(),
-            3);
-
-  animator->StopAnimatingProperty(LayerAnimationElement::OPACITY);
-  EXPECT_EQ(threaded_delegate->GetNumberOfRemoveThreadedKeyframeModelsCalls(),
-            4);
-  EXPECT_FALSE(animator->is_animating());
-}
-
-TEST(LayerAnimatorTest, RemoveKeyframeModelsByAbortingSequence) {
-  TestLayerAnimationDelegate delegate;
-  TestLayerThreadedAnimationDelegate* threaded_delegate =
-      static_cast<TestLayerThreadedAnimationDelegate*>(
-          delegate.GetThreadedAnimationDelegate());
-  LayerAnimatorTestController test_controller(
-      CreateDefaultTestAnimator(&delegate));
-  LayerAnimator* animator = test_controller.animator();
-  base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
-  base::TimeTicks start_time = animator->last_step_time();
-  base::TimeTicks effective_start = start_time + 0.5 * delta;
-
-  delegate.SetOpacityFromAnimation(0.f,
-                                   PropertyChangeReason::NOT_FROM_ANIMATION);
-  LayerAnimationSequence* sequence = new LayerAnimationSequence(
-      LayerAnimationElement::CreateOpacityElement(1.f, delta));
-
-  animator->StartAnimation(sequence);
-  animator->OnThreadedAnimationStarted(
-      effective_start, cc::TargetProperty::OPACITY,
-      test_controller.GetRunningSequence(LayerAnimationElement::OPACITY)
-          ->animation_group_id());
-  animator->Step(effective_start + 0.5 * delta);
-  EXPECT_TRUE(animator->is_animating());
-
-  animator->AbortAllAnimations();
-  EXPECT_EQ(threaded_delegate->GetNumberOfRemoveThreadedKeyframeModelsCalls(),
-            1);
-}
-
 TEST(LayerAnimatorTest, AddObserverExplicit) {
   TestLayerAnimationObserver observer;
   TestLayerAnimationDelegate delegate;
diff --git a/ui/compositor/layer_threaded_animation_delegate.h b/ui/compositor/layer_threaded_animation_delegate.h
index a3306d36..9b1251d 100644
--- a/ui/compositor/layer_threaded_animation_delegate.h
+++ b/ui/compositor/layer_threaded_animation_delegate.h
@@ -15,9 +15,9 @@
 // Attach CC keyframe_models using this interface.
 class COMPOSITOR_EXPORT LayerThreadedAnimationDelegate {
  public:
-  virtual void AddThreadedKeyframeModel(
+  virtual void AddThreadedAnimation(
       std::unique_ptr<cc::KeyframeModel> keyframe_model) = 0;
-  virtual void RemoveThreadedKeyframeModels() = 0;
+  virtual void RemoveThreadedAnimation(int keyframe_model_id) = 0;
 
  protected:
   virtual ~LayerThreadedAnimationDelegate() {}
diff --git a/ui/compositor/run_all_unittests.cc b/ui/compositor/run_all_unittests.cc
index 40b96f9..92a6dc6 100644
--- a/ui/compositor/run_all_unittests.cc
+++ b/ui/compositor/run_all_unittests.cc
@@ -4,13 +4,13 @@
 
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/compositor/test/test_suite.h"
 
 int main(int argc, char** argv) {
   ui::test::CompositorTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(
       argc, argv,
diff --git a/ui/compositor/test/test_layer_animation_delegate.cc b/ui/compositor/test/test_layer_animation_delegate.cc
index b59eccc..478ea1a 100644
--- a/ui/compositor/test/test_layer_animation_delegate.cc
+++ b/ui/compositor/test/test_layer_animation_delegate.cc
@@ -9,8 +9,7 @@
 
 namespace ui {
 
-TestLayerThreadedAnimationDelegate::TestLayerThreadedAnimationDelegate()
-    : number_of_remove_threaded_keyframe_models_calls_(0) {}
+TestLayerThreadedAnimationDelegate::TestLayerThreadedAnimationDelegate() {}
 
 TestLayerThreadedAnimationDelegate::~TestLayerThreadedAnimationDelegate() {}
 
@@ -172,11 +171,10 @@
   cc_layer_ = cc::Layer::Create();
 }
 
-void TestLayerThreadedAnimationDelegate::AddThreadedKeyframeModel(
+void TestLayerThreadedAnimationDelegate::AddThreadedAnimation(
     std::unique_ptr<cc::KeyframeModel> keyframe_model) {}
 
-void TestLayerThreadedAnimationDelegate::RemoveThreadedKeyframeModels() {
-  ++number_of_remove_threaded_keyframe_models_calls_;
-}
+void TestLayerThreadedAnimationDelegate::RemoveThreadedAnimation(
+    int keyframe_model_id) {}
 
 }  // namespace ui
diff --git a/ui/compositor/test/test_layer_animation_delegate.h b/ui/compositor/test/test_layer_animation_delegate.h
index 145c29e..7cdf158 100644
--- a/ui/compositor/test/test_layer_animation_delegate.h
+++ b/ui/compositor/test/test_layer_animation_delegate.h
@@ -21,15 +21,9 @@
   ~TestLayerThreadedAnimationDelegate() override;
 
   // Implementation of LayerThreadedAnimationDelegate
-  void AddThreadedKeyframeModel(
+  void AddThreadedAnimation(
       std::unique_ptr<cc::KeyframeModel> keyframe_model) override;
-  void RemoveThreadedKeyframeModels() override;
-  int GetNumberOfRemoveThreadedKeyframeModelsCalls() const {
-    return number_of_remove_threaded_keyframe_models_calls_;
-  }
-
- private:
-  int number_of_remove_threaded_keyframe_models_calls_;
+  void RemoveThreadedAnimation(int keyframe_model_id) override;
 };
 
 class TestLayerAnimationDelegate : public LayerAnimationDelegate {
diff --git a/ui/display/BUILD.gn b/ui/display/BUILD.gn
index b55a4be..8d014f0 100644
--- a/ui/display/BUILD.gn
+++ b/ui/display/BUILD.gn
@@ -184,7 +184,7 @@
     "//base",
     "//base/test:test_support",
     "//cc/base",
-    "//mojo/edk/test:run_all_unittests",
+    "//mojo/core/test:run_all_unittests",
     "//testing/gmock",
     "//testing/gtest",
     "//ui/display/manager",
diff --git a/ui/events/BUILD.gn b/ui/events/BUILD.gn
index 36cd38f..681eaef 100644
--- a/ui/events/BUILD.gn
+++ b/ui/events/BUILD.gn
@@ -448,6 +448,7 @@
       "blink/fling_booster_unittest.cc",
       "blink/input_handler_proxy_unittest.cc",
       "blink/input_scroll_elasticity_controller_unittest.cc",
+      "blink/prediction/kalman_predictor_unittest.cc",
       "blink/prediction/least_squares_predictor_unittest.cc",
       "blink/scroll_predictor_unittest.cc",
       "blink/web_input_event_traits_unittest.cc",
@@ -494,7 +495,7 @@
       "//base/test:test_support",
       "//cc",
       "//ipc:test_support",
-      "//mojo/edk/test:run_all_unittests",
+      "//mojo/core/test:run_all_unittests",
       "//mojo/public/cpp/bindings",
       "//skia",
       "//testing/gmock",
diff --git a/ui/events/blink/BUILD.gn b/ui/events/blink/BUILD.gn
index 61c2a83..c95af4cf 100644
--- a/ui/events/blink/BUILD.gn
+++ b/ui/events/blink/BUILD.gn
@@ -27,6 +27,10 @@
     "prediction/empty_predictor.cc",
     "prediction/empty_predictor.h",
     "prediction/input_predictor.h",
+    "prediction/kalman_filter.cc",
+    "prediction/kalman_filter.h",
+    "prediction/kalman_predictor.cc",
+    "prediction/kalman_predictor.h",
     "prediction/least_squares_predictor.cc",
     "prediction/least_squares_predictor.h",
     "scroll_predictor.cc",
diff --git a/ui/events/blink/prediction/input_predictor_unittest.cc b/ui/events/blink/prediction/input_predictor_unittest.cc
new file mode 100644
index 0000000..ec8a051
--- /dev/null
+++ b/ui/events/blink/prediction/input_predictor_unittest.cc
@@ -0,0 +1,56 @@
+// 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 UI_EVENTS_BLINK_PREDICTION_INPUT_PREDICTOR_UNITTEST_H_
+#define UI_EVENTS_BLINK_PREDICTION_INPUT_PREDICTOR_UNITTEST_H_
+
+#include "ui/events/blink/prediction/input_predictor.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/blink/blink_event_util.h"
+
+namespace {
+
+constexpr double kEpsilon = 0.1;
+
+}  // namespace
+
+namespace ui {
+
+// Base class for predictor unit tests
+class InputPredictorTest : public testing::Test {
+ public:
+  InputPredictorTest() {}
+
+  static base::TimeTicks FromMilliseconds(int64_t ms) {
+    return blink::WebInputEvent::GetStaticTimeStampForTests() +
+           base::TimeDelta::FromMilliseconds(ms);
+  }
+
+  void ValidatePredictor(const std::vector<double>& x,
+                         const std::vector<double>& y,
+                         const std::vector<double>& timestamp_ms) {
+    predictor_->Reset();
+    for (size_t i = 0; i < timestamp_ms.size(); i++) {
+      if (predictor_->HasPrediction()) {
+        ui::InputPredictor::InputData result;
+        EXPECT_TRUE(predictor_->GeneratePrediction(
+            FromMilliseconds(timestamp_ms[i]), &result));
+        EXPECT_NEAR(result.pos.x(), x[i], kEpsilon);
+        EXPECT_NEAR(result.pos.y(), y[i], kEpsilon);
+      }
+      InputPredictor::InputData data = {gfx::PointF(x[i], y[i]),
+                                        FromMilliseconds(timestamp_ms[i])};
+      predictor_->Update(data);
+    }
+  }
+
+ protected:
+  std::unique_ptr<InputPredictor> predictor_;
+
+  DISALLOW_COPY_AND_ASSIGN(InputPredictorTest);
+};
+
+}  // namespace ui
+
+#endif  // UI_EVENTS_BLINK_PREDICTION_INPUT_PREDICTOR_UNITTEST_H_
diff --git a/ui/events/blink/prediction/kalman_filter.cc b/ui/events/blink/prediction/kalman_filter.cc
new file mode 100644
index 0000000..966df97
--- /dev/null
+++ b/ui/events/blink/prediction/kalman_filter.cc
@@ -0,0 +1,122 @@
+// 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 "ui/events/blink/prediction/kalman_filter.h"
+
+namespace {
+constexpr uint32_t kStableIterNum = 4;
+
+constexpr double kSigmaProcess = 0.01;
+constexpr double kSigmaMeasurement = 1.0;
+
+gfx::Matrix3F GetStateTransition(double kDt) {
+  gfx::Matrix3F state_transition = gfx::Matrix3F::Zeros();
+  // State translation matrix is basic physics.
+  // new_pos = pre_pos + v * dt + 1/2 * a * dt^2.
+  // new_v = v + a * dt.
+  // new_a = a .
+  state_transition.set(1.0, kDt, 0.5 * kDt * kDt, 0.0, 1.0, kDt, 0.0, 0.0, 1.0);
+  return state_transition;
+}
+
+gfx::Matrix3F GetProcessNoise(double kDt) {
+  gfx::Vector3dF process_noise(0.5 * kDt * kDt, kDt, 1.0);
+  // We model the system noise as noisy force on the pointer.
+  // The following matrix describes the impact of that noise on each state.
+  gfx::Matrix3F process_noise_covariance = gfx::Matrix3F::FromOuterProduct(
+      process_noise, gfx::ScaleVector3d(process_noise, kSigmaProcess));
+  return process_noise_covariance;
+}
+
+}  // namespace
+
+namespace ui {
+
+KalmanFilter::KalmanFilter()
+    : state_estimation_(gfx::Vector3dF()),
+      error_covariance_matrix_(gfx::Matrix3F::Identity()),
+      state_transition_matrix_(GetStateTransition(1.0)),
+      process_noise_covariance_matrix_(GetProcessNoise(1.0)),
+      measurement_vector_(gfx::Vector3dF(1.0, 0.0, 0.0)),
+      measurement_noise_variance_(kSigmaMeasurement),
+      iteration_count_(0) {}
+
+KalmanFilter::~KalmanFilter() = default;
+
+const gfx::Vector3dF& KalmanFilter::GetStateEstimation() const {
+  return state_estimation_;
+}
+
+bool KalmanFilter::Stable() const {
+  return iteration_count_ >= kStableIterNum;
+}
+
+void KalmanFilter::Update(double observation, double dt) {
+  if (iteration_count_++ == 0) {
+    // We only update the state estimation in the first iteration.
+    state_estimation_ = gfx::Vector3dF(observation, 0, 0);
+    return;
+  }
+  Predict(dt);
+  // Y = z - H * X
+  double y =
+      observation - gfx::DotProduct(measurement_vector_, state_estimation_);
+  // S = H * P * H' + R
+  double S = gfx::DotProduct(measurement_vector_,
+                             gfx::MatrixProduct(error_covariance_matrix_,
+                                                measurement_vector_)) +
+             measurement_noise_variance_;
+  // K = P * H' * inv(S)
+  gfx::Vector3dF kalman_gain = gfx::ScaleVector3d(
+      gfx::MatrixProduct(error_covariance_matrix_, measurement_vector_),
+      1.0 / S);
+  // X = X + K * Y
+  state_estimation_ += gfx::ScaleVector3d(kalman_gain, y);
+  // I_HK = eye(P) - K * H
+  gfx::Matrix3F I_KH =
+      gfx::Matrix3F::Identity() -
+      gfx::Matrix3F::FromOuterProduct(kalman_gain, measurement_vector_);
+
+  // P = I_KH * P * I_KH' + K * R * K'
+  error_covariance_matrix_ =
+      gfx::MatrixProduct(gfx::MatrixProduct(I_KH, error_covariance_matrix_),
+                         I_KH.Transpose()) +
+      gfx::Matrix3F::FromOuterProduct(
+          gfx::ScaleVector3d(kalman_gain, measurement_noise_variance_),
+          kalman_gain);
+}
+
+void KalmanFilter::Reset() {
+  state_estimation_ = gfx::Vector3dF();
+  error_covariance_matrix_ = gfx::Matrix3F::Identity();
+  iteration_count_ = 0;
+}
+
+double KalmanFilter::GetPosition() const {
+  return GetStateEstimation().x();
+}
+
+double KalmanFilter::GetVelocity() const {
+  return GetStateEstimation().y();
+}
+
+double KalmanFilter::GetAcceleration() const {
+  return GetStateEstimation().z();
+}
+
+void KalmanFilter::Predict(double dt) {
+  DCHECK_GT(iteration_count_, 0u);
+  state_transition_matrix_ = GetStateTransition(dt);
+  // X = F * X
+  state_estimation_ =
+      gfx::MatrixProduct(state_transition_matrix_, state_estimation_);
+  // P = F * P * F' + Q
+  error_covariance_matrix_ =
+      gfx::MatrixProduct(gfx::MatrixProduct(state_transition_matrix_,
+                                            error_covariance_matrix_),
+                         state_transition_matrix_.Transpose()) +
+      GetProcessNoise(dt);
+}
+
+}  // namespace ui
diff --git a/ui/events/blink/prediction/kalman_filter.h b/ui/events/blink/prediction/kalman_filter.h
new file mode 100644
index 0000000..50ce719
--- /dev/null
+++ b/ui/events/blink/prediction/kalman_filter.h
@@ -0,0 +1,84 @@
+// 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 UI_EVENTS_BLINK_PREDICTION_KALMAN_FILTER_H_
+#define UI_EVENTS_BLINK_PREDICTION_KALMAN_FILTER_H_
+
+#include "ui/gfx/geometry/matrix3_f.h"
+
+namespace ui {
+
+// This Kalman filter is used to predict state in one axles.
+class KalmanFilter {
+ public:
+  KalmanFilter();
+  ~KalmanFilter();
+
+  // Get the estimation of current state.
+  const gfx::Vector3dF& GetStateEstimation() const;
+
+  // Will return true only if the kalman filter has seen enough data and is
+  // considered as stable.
+  bool Stable() const;
+
+  // Update the observation of the system.
+  void Update(double observation, double dt);
+
+  void Reset();
+
+  // Get the predicted values from the kalman filter.
+  double GetPosition() const;
+  double GetVelocity() const;
+  double GetAcceleration() const;
+
+ private:
+  void Predict(double dt);
+
+  // Estimate of the latent state
+  // Symbol: X
+  // Dimension: state_vector_dim_
+  gfx::Vector3dF state_estimation_;
+
+  // The covariance of the difference between prior predicted latent
+  // state and posterior estimated latent state (the so-called "innovation".
+  // Symbol: P
+  // Dimension: state_vector_dim_, state_vector_dim_
+  gfx::Matrix3F error_covariance_matrix_;
+
+  // For position, state transition matrix is derived from basic physics:
+  // new_x = x + v * dt + 1/2 * a * dt^2
+  // new_v = v + a * dt
+  // ...
+  // Matrix that transforms current state to next state
+  // Symbol: F
+  // Dimension: state_vector_dim_, state_vector_dim_
+  gfx::Matrix3F state_transition_matrix_;
+
+  // A time-varying noise parameter that will be estimated as part of the
+  // kalman filter process.
+  // Symbol: Q
+  // Dimension: state_vector_dim_, state_vector_dim_
+  gfx::Matrix3F process_noise_covariance_matrix_;
+
+  // Vector to transform estimate to measurement.
+  // Symbol: H
+  // Dimension: state_vector_dim_
+  const gfx::Vector3dF measurement_vector_;
+
+  // A time-varying noise parameter that will be estimated as part of the
+  // kalman filter process.
+  // Symbol: R
+  double measurement_noise_variance_;
+
+  // Tracks number of update iteration happened at this kalman filter. At the
+  // 1st iteration, the state estimate will be updated to the measured value.
+  // After a few iterations, the KalmanFilter is considered stable.
+  uint32_t iteration_count_;
+
+  DISALLOW_COPY_AND_ASSIGN(KalmanFilter);
+};
+
+}  // namespace ui
+
+#endif  // UI_EVENTS_BLINK_PREDICTION_KALMAN_FILTER_H_
diff --git a/ui/events/blink/prediction/kalman_predictor.cc b/ui/events/blink/prediction/kalman_predictor.cc
new file mode 100644
index 0000000..7b17105
--- /dev/null
+++ b/ui/events/blink/prediction/kalman_predictor.cc
@@ -0,0 +1,87 @@
+// 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 "ui/events/blink/prediction/kalman_predictor.h"
+
+#include <algorithm>
+#include <cmath>
+
+namespace {
+
+constexpr double kMaxInterval = 50.0;
+// Influence of acceleration during each prediction sample
+constexpr float kAccelerationInfluence = 0.5f;
+// Influence of velocity during each prediction sample
+constexpr float kVelocityInfluence = 1.0f;
+
+}  // namespace
+
+namespace ui {
+
+KalmanPredictor::KalmanPredictor() = default;
+
+KalmanPredictor::~KalmanPredictor() = default;
+
+void KalmanPredictor::Reset() {
+  x_predictor_.Reset();
+  y_predictor_.Reset();
+  last_point_.time_stamp = base::TimeTicks();
+}
+
+void KalmanPredictor::Update(const InputData& cur_input) {
+  double dt(0);
+  if (!last_point_.time_stamp.is_null())
+    dt = (cur_input.time_stamp - last_point_.time_stamp).InMillisecondsF();
+  if (dt > kMaxInterval) {
+    Reset();
+    return;
+  }
+
+  last_point_ = cur_input;
+  x_predictor_.Update(cur_input.pos.x(), dt);
+  y_predictor_.Update(cur_input.pos.y(), dt);
+}
+
+bool KalmanPredictor::HasPrediction() const {
+  return x_predictor_.Stable() && y_predictor_.Stable();
+}
+
+bool KalmanPredictor::GeneratePrediction(base::TimeTicks frame_time,
+                                         InputData* result) const {
+  std::vector<InputData> pred_points;
+
+  double dt = (frame_time - last_point_.time_stamp).InMillisecondsF();
+  // Kalman filter is not very good when predicting backwards. Besides,
+  // predicting backwards means increasing latency. Thus disable prediction when
+  // dt < 0.
+  if (!HasPrediction() || dt < 0)
+    return false;
+
+  gfx::Vector2dF position(last_point_.pos.x(), last_point_.pos.y());
+  // gfx::Vector2dF position = PredictPosition();
+  gfx::Vector2dF velocity = PredictVelocity();
+  gfx::Vector2dF acceleration = PredictAcceleration();
+
+  position += ScaleVector2d(velocity, kVelocityInfluence * dt) +
+              ScaleVector2d(acceleration, kAccelerationInfluence * dt * dt);
+
+  result->pos.set_x(position.x());
+  result->pos.set_y(position.y());
+  return true;
+}
+
+gfx::Vector2dF KalmanPredictor::PredictPosition() const {
+  return gfx::Vector2dF(x_predictor_.GetPosition(), y_predictor_.GetPosition());
+}
+
+gfx::Vector2dF KalmanPredictor::PredictVelocity() const {
+  return gfx::Vector2dF(x_predictor_.GetVelocity(), y_predictor_.GetVelocity());
+}
+
+gfx::Vector2dF KalmanPredictor::PredictAcceleration() const {
+  return gfx::Vector2dF(x_predictor_.GetAcceleration(),
+                        y_predictor_.GetAcceleration());
+}
+
+}  // namespace ui
diff --git a/ui/events/blink/prediction/kalman_predictor.h b/ui/events/blink/prediction/kalman_predictor.h
new file mode 100644
index 0000000..cf1edb33
--- /dev/null
+++ b/ui/events/blink/prediction/kalman_predictor.h
@@ -0,0 +1,57 @@
+// 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 UI_EVENTS_BLINK_PREDICTION_KALMAN_PREDICTOR_H_
+#define UI_EVENTS_BLINK_PREDICTION_KALMAN_PREDICTOR_H_
+
+#include <vector>
+
+#include "ui/events/blink/prediction/input_predictor.h"
+#include "ui/events/blink/prediction/kalman_filter.h"
+
+namespace ui {
+
+// Class to perform kalman filter prediction inherited from InputPredictor.
+// This predictor uses kalman filters to predict the current status of the
+// motion. Then it predict the future points using <current_position,
+// predicted_velocity, predicted_acceleration>. Each kalman_filter will only
+// be used to predict one dimension (x, y).
+class KalmanPredictor : public InputPredictor {
+ public:
+  explicit KalmanPredictor();
+  ~KalmanPredictor() override;
+
+  // Reset the predictor to initial state.
+  void Reset() override;
+
+  // Store current input in queue.
+  void Update(const InputData& cur_input) override;
+
+  // Return if there is enough data in the queue to generate prediction.
+  bool HasPrediction() const override;
+
+  // Generate the prediction based on stored points and given time_stamp.
+  // Return false if no prediction available.
+  bool GeneratePrediction(base::TimeTicks frame_time,
+                          InputData* result) const override;
+
+ private:
+  // The following functions get the predicted values from kalman filters.
+  gfx::Vector2dF PredictPosition() const;
+  gfx::Vector2dF PredictVelocity() const;
+  gfx::Vector2dF PredictAcceleration() const;
+
+  // Prdictor for each axis.
+  KalmanFilter x_predictor_;
+  KalmanFilter y_predictor_;
+
+  // The last input point.
+  InputData last_point_;
+
+  DISALLOW_COPY_AND_ASSIGN(KalmanPredictor);
+};
+
+}  // namespace ui
+
+#endif  // UI_EVENTS_BLINK_PREDICTION_KALMAN_PREDICTOR_H_
diff --git a/ui/events/blink/prediction/kalman_predictor_unittest.cc b/ui/events/blink/prediction/kalman_predictor_unittest.cc
new file mode 100644
index 0000000..6a4074cf
--- /dev/null
+++ b/ui/events/blink/prediction/kalman_predictor_unittest.cc
@@ -0,0 +1,109 @@
+// 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 <vector>
+
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/events/blink/prediction/input_predictor_unittest.cc"
+#include "ui/events/blink/prediction/kalman_predictor.h"
+
+namespace ui {
+namespace test {
+namespace {
+
+constexpr uint32_t kExpectedStableIterNum = 4;
+constexpr double kEpsilon = 0.001;
+
+struct DataSet {
+  double initial_observation;
+  std::vector<double> observation;
+  std::vector<double> position;
+  std::vector<double> velocity;
+  std::vector<double> acceleration;
+};
+
+void ValidateSingleKalmanFilter(const DataSet& data) {
+  std::unique_ptr<KalmanFilter> kalman_filter =
+      std::make_unique<KalmanFilter>();
+  constexpr double kDtMillisecond = 8;
+  kalman_filter->Update(data.initial_observation, kDtMillisecond);
+  for (size_t i = 0; i < data.observation.size(); i++) {
+    kalman_filter->Update(data.observation[i], kDtMillisecond);
+    EXPECT_NEAR(data.position[i], kalman_filter->GetPosition(), kEpsilon);
+    EXPECT_NEAR(data.velocity[i], kalman_filter->GetVelocity(), kEpsilon);
+    EXPECT_NEAR(data.acceleration[i], kalman_filter->GetAcceleration(),
+                kEpsilon);
+  }
+}
+
+}  // namespace
+
+class KalmanPredictorTest : public InputPredictorTest {
+ public:
+  explicit KalmanPredictorTest() {}
+
+  void SetUp() override {
+    predictor_ = std::make_unique<ui::KalmanPredictor>();
+  }
+
+  DISALLOW_COPY_AND_ASSIGN(KalmanPredictorTest);
+};
+
+// Test the a single axle kalman filter behavior with preset datas.
+TEST_F(KalmanPredictorTest, KalmanFilterPredictedValue) {
+  DataSet data;
+  data.initial_observation = 0;
+  data.observation = {1, 2, 3, 4, 5, 6};
+  data.position = {0.999, 2.007, 3.001, 3.999, 5.000, 6.000};
+  data.velocity = {0.242, 0.130, 0.122, 0.124, 0.125, 0.125};
+  data.acceleration = {0.029, 0.000, 0.000, 0.000, 0.000, 0.000};
+  ValidateSingleKalmanFilter(data);
+
+  data.initial_observation = 0;
+  data.observation = {1, 2, 4, 8, 16, 32};
+  data.position = {0.999, 2.007, 3.976, 7.970, 15.950, 31.896};
+  data.velocity = {0.242, 0.130, 0.298, 0.623, 1.240, 2.475};
+  data.acceleration = {0.029, 0.000, 0.015, 0.034, 0.065, 0.130};
+  ValidateSingleKalmanFilter(data);
+}
+
+TEST_F(KalmanPredictorTest, ShouldHasPrediction) {
+  for (uint32_t i = 0; i < kExpectedStableIterNum; i++) {
+    EXPECT_FALSE(predictor_->HasPrediction());
+    InputPredictor::InputData data = {gfx::PointF(1, 1),
+                                      FromMilliseconds(8 * i)};
+    predictor_->Update(data);
+  }
+  EXPECT_TRUE(predictor_->HasPrediction());
+
+  predictor_->Reset();
+  EXPECT_FALSE(predictor_->HasPrediction());
+}
+
+// Tests the kalman predictor constant position.
+TEST_F(KalmanPredictorTest, PredictConstantValue) {
+  std::vector<double> x = {50, 50, 50, 50, 50, 50};
+  std::vector<double> y = {-50, -50, -50, -50, -50, -50};
+  std::vector<double> t = {8, 16, 24, 32, 40, 48};
+  ValidatePredictor(x, y, t);
+}
+
+// Tests the kalman predictor predict constant velocity.
+TEST_F(KalmanPredictorTest, PredictLinearValue) {
+  std::vector<double> x = {0, 8, 16, 20, 23, 27, 31, 38, 48, 60};
+  std::vector<double> y = {30, 38, 46, 50, 53, 57, 61, 68, 78, 90};
+  std::vector<double> t = {0, 8, 16, 20, 23, 27, 31, 38, 48, 60};
+  ValidatePredictor(x, y, t);
+}
+
+// Tests the kalman predictor predict constant acceleration.
+TEST_F(KalmanPredictorTest, PredictQuadraticValue) {
+  std::vector<double> x = {0, 2, 8, 18, 32, 50, 72, 98};
+  std::vector<double> y = {10, 11, 14, 19, 26, 35, 46, 59};
+  std::vector<double> t = {8, 16, 24, 32, 40, 48, 56, 64};
+  ValidatePredictor(x, y, t);
+}
+
+}  // namespace test
+}  // namespace ui
diff --git a/ui/events/blink/prediction/least_squares_predictor.h b/ui/events/blink/prediction/least_squares_predictor.h
index 56344fc2..c5eb33b 100644
--- a/ui/events/blink/prediction/least_squares_predictor.h
+++ b/ui/events/blink/prediction/least_squares_predictor.h
@@ -32,7 +32,7 @@
   bool HasPrediction() const override;
 
   // Generate the prediction based on stored points and given time_stamp.
-  // Return an empty vector if no prediction available.
+  // Return false if no prediction available.
   bool GeneratePrediction(base::TimeTicks frame_time,
                           InputData* result) const override;
 
diff --git a/ui/events/blink/prediction/least_squares_predictor_unittest.cc b/ui/events/blink/prediction/least_squares_predictor_unittest.cc
index 432fdc4..c4836f0 100644
--- a/ui/events/blink/prediction/least_squares_predictor_unittest.cc
+++ b/ui/events/blink/prediction/least_squares_predictor_unittest.cc
@@ -4,49 +4,19 @@
 
 #include "ui/events/blink/prediction/least_squares_predictor.h"
 #include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-constexpr double kEpsilon = 0.01;
-
-}  // namespace
+#include "ui/events/blink/prediction/input_predictor_unittest.cc"
 
 namespace ui {
+namespace test {
 
-class LSQPredictorTest : public testing::Test {
+class LSQPredictorTest : public InputPredictorTest {
  public:
-  LSQPredictorTest() {}
+  explicit LSQPredictorTest() {}
 
   void SetUp() override {
     predictor_ = std::make_unique<ui::LeastSquaresPredictor>();
   }
 
-  static base::TimeTicks FromMilliseconds(int64_t ms) {
-    return base::TimeTicks() + base::TimeDelta::FromMilliseconds(ms);
-  }
-
-  void ValidateLeastSquaresPredictor(const std::vector<double>& x,
-                                     const std::vector<double>& y,
-                                     const std::vector<double>& timestamp_ms) {
-    predictor_->Reset();
-    ui::InputPredictor::InputData result;
-
-    for (size_t i = 0; i < timestamp_ms.size(); i++) {
-      if (i >= LeastSquaresPredictor::kSize) {
-        EXPECT_TRUE(predictor_->GeneratePrediction(
-            FromMilliseconds(timestamp_ms[i]), &result));
-        EXPECT_NEAR(result.pos.x(), x[i], kEpsilon);
-        EXPECT_NEAR(result.pos.y(), y[i], kEpsilon);
-      }
-      InputPredictor::InputData data = {gfx::PointF(x[i], y[i]),
-                                        FromMilliseconds(timestamp_ms[i])};
-      predictor_->Update(data);
-    }
-  }
-
- protected:
-  std::unique_ptr<LeastSquaresPredictor> predictor_;
-
   DISALLOW_COPY_AND_ASSIGN(LSQPredictorTest);
 };
 
@@ -68,20 +38,20 @@
   std::vector<double> x = {22, 58, 102, 108.094};
   std::vector<double> y = {100, 100, 100, 100};
   std::vector<double> t = {13, 21, 37, 42};
-  ValidateLeastSquaresPredictor(x, y, t);
+  ValidatePredictor(x, y, t);
 
   x = {100, 100, 101, 104.126};
   y = {120, 280, 600, 1364.93};
   t = {101, 126, 148, 180};
-  ValidateLeastSquaresPredictor(x, y, t);
+  ValidatePredictor(x, y, t);
 }
 
-// Tests the LSQ predictor predict linear value correctly.
+// Tests the LSQ predictor predict constant velocity.
 TEST_F(LSQPredictorTest, PredictLinearValue) {
-  std::vector<double> x = {8, 16, 24, 32, 40};
-  std::vector<double> y = {300, 410, 520, 630, 740};
-  std::vector<double> t = {8, 16, 24, 32, 40};
-  ValidateLeastSquaresPredictor(x, y, t);
+  std::vector<double> x = {0, 4, 10, 15, 20, 28, 30, 38};
+  std::vector<double> y = {30, 34, 40, 45, 50, 58, 60, 68};
+  std::vector<double> t = {0, 4, 10, 15, 20, 28, 30, 38};
+  ValidatePredictor(x, y, t);
 }
 
 // Tests the LSQ predictor predict quadratic value correctly.
@@ -89,7 +59,7 @@
   std::vector<double> x = {2, 8, 18, 32, 50};
   std::vector<double> y = {100, 400, 900, 1600, 2500};
   std::vector<double> t = {8, 16, 24, 32, 40};
-  ValidateLeastSquaresPredictor(x, y, t);
+  ValidatePredictor(x, y, t);
 }
 
 // Tests that lsq predictor will not crash when given constant time stamp.
@@ -116,4 +86,5 @@
   EXPECT_FALSE(predictor_->GeneratePrediction(FromMilliseconds(42), &result));
 }
 
+}  // namespace test
 }  // namespace ui
diff --git a/ui/events/blink/scroll_predictor.cc b/ui/events/blink/scroll_predictor.cc
index b2caae69f..a8f2de9 100644
--- a/ui/events/blink/scroll_predictor.cc
+++ b/ui/events/blink/scroll_predictor.cc
@@ -7,6 +7,7 @@
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_params.h"
 #include "ui/events/blink/prediction/empty_predictor.h"
+#include "ui/events/blink/prediction/kalman_predictor.h"
 #include "ui/events/blink/prediction/least_squares_predictor.h"
 
 using blink::WebInputEvent;
@@ -18,6 +19,7 @@
 
 constexpr char kPredictor[] = "predictor";
 constexpr char kScrollPredictorTypeLsq[] = "lsq";
+constexpr char kScrollPredictorTypeKalman[] = "kalman";
 
 }  // namespace
 
@@ -26,6 +28,8 @@
       features::kResamplingScrollEvents, kPredictor);
   if (predictor_type_ == kScrollPredictorTypeLsq)
     predictor_ = std::make_unique<LeastSquaresPredictor>();
+  else if (predictor_type_ == kScrollPredictorTypeKalman)
+    predictor_ = std::make_unique<KalmanPredictor>();
   else
     predictor_ = std::make_unique<EmptyPredictor>();
 }
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index ab2b7c9..fec5071 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -799,7 +799,7 @@
   if (!is_ios) {
     deps += [
       "//cc/paint",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//mojo/public/cpp/bindings",
       "//ui/gfx/geometry/mojo:unit_test",
       "//ui/gfx/image/mojo:unit_test",
diff --git a/ui/gfx/geometry/matrix3_f.cc b/ui/gfx/geometry/matrix3_f.cc
index de59cc3..1420ee53 100644
--- a/ui/gfx/geometry/matrix3_f.cc
+++ b/ui/gfx/geometry/matrix3_f.cc
@@ -97,6 +97,20 @@
   return true;
 }
 
+Matrix3F Matrix3F::Add(const Matrix3F& rhs) const {
+  Matrix3F result;
+  for (int i = 0; i < M_END; ++i)
+    result.data_[i] = data_[i] + rhs.data_[i];
+  return result;
+}
+
+Matrix3F Matrix3F::Subtract(const Matrix3F& rhs) const {
+  Matrix3F result;
+  for (int i = 0; i < M_END; ++i)
+    result.data_[i] = data_[i] - rhs.data_[i];
+  return result;
+}
+
 Matrix3F Matrix3F::Inverse() const {
   Matrix3F inverse = Matrix3F::Zeros();
   double determinant = Determinant3x3(data_);
diff --git a/ui/gfx/geometry/matrix3_f.h b/ui/gfx/geometry/matrix3_f.h
index 38014b51..7fab2e3 100644
--- a/ui/gfx/geometry/matrix3_f.h
+++ b/ui/gfx/geometry/matrix3_f.h
@@ -65,6 +65,11 @@
     data_[MatrixToArrayCoords(2, i)] = c.z();
   }
 
+  // Produces a new matrix by adding the elements of |rhs| to this matrix
+  Matrix3F Add(const Matrix3F& rhs) const;
+  // Produces a new matrix by subtracting elements of |rhs| from this matrix.
+  Matrix3F Subtract(const Matrix3F& rhs) const;
+
   // Returns an inverse of this if the matrix is non-singular, zero (== Zero())
   // otherwise.
   Matrix3F Inverse() const;
@@ -114,6 +119,18 @@
   return lhs.IsEqual(rhs);
 }
 
+// Matrix addition. Produces a new matrix by adding the corresponding elements
+// together.
+inline Matrix3F operator+(const Matrix3F& lhs, const Matrix3F& rhs) {
+  return lhs.Add(rhs);
+}
+
+// Matrix subtraction. Produces a new matrix by subtracting elements of rhs
+// from corresponding elements of lhs.
+inline Matrix3F operator-(const Matrix3F& lhs, const Matrix3F& rhs) {
+  return lhs.Subtract(rhs);
+}
+
 GFX_EXPORT Matrix3F MatrixProduct(const Matrix3F& lhs, const Matrix3F& rhs);
 GFX_EXPORT Vector3dF MatrixProduct(const Matrix3F& lhs, const Vector3dF& rhs);
 
diff --git a/ui/gfx/geometry/matrix3_unittest.cc b/ui/gfx/geometry/matrix3_unittest.cc
index e34d3605..27e9182 100644
--- a/ui/gfx/geometry/matrix3_unittest.cc
+++ b/ui/gfx/geometry/matrix3_unittest.cc
@@ -160,5 +160,23 @@
   EXPECT_TRUE(expected_eigenvectors.IsNear(eigenvectors, 0.00001f));
 }
 
+TEST(Matrix3fTest, Operators) {
+  Matrix3F matrix1 = Matrix3F::Zeros();
+  matrix1.set(1, 2, 3, 4, 5, 6, 7, 8, 9);
+  EXPECT_EQ(matrix1 + Matrix3F::Zeros(), matrix1);
+
+  Matrix3F matrix2 = Matrix3F::Zeros();
+  matrix2.set(-1, -2, -3, -4, -5, -6, -7, -8, -9);
+  EXPECT_EQ(matrix1 + matrix2, Matrix3F::Zeros());
+
+  EXPECT_EQ(Matrix3F::Zeros() - matrix1, matrix2);
+
+  Matrix3F result = Matrix3F::Zeros();
+  result.set(2, 4, 6, 8, 10, 12, 14, 16, 18);
+  EXPECT_EQ(matrix1 - matrix2, result);
+  result.set(-2, -4, -6, -8, -10, -12, -14, -16, -18);
+  EXPECT_EQ(matrix2 - matrix1, result);
 }
-}
+
+}  // namespace
+}  // namespace gfx
diff --git a/ui/gfx/test/DEPS b/ui/gfx/test/DEPS
index 047e860..960c0d1 100644
--- a/ui/gfx/test/DEPS
+++ b/ui/gfx/test/DEPS
@@ -1,6 +1,6 @@
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder/embedder.h",
+    "+mojo/core/embedder/embedder.h",
     "+ui/base/resource/resource_bundle.h",
     "+ui/base/ui_base_paths.h",
   ],
diff --git a/ui/gfx/test/run_all_unittests.cc b/ui/gfx/test/run_all_unittests.cc
index 824703c..6e8079f9 100644
--- a/ui/gfx/test/run_all_unittests.cc
+++ b/ui/gfx/test/run_all_unittests.cc
@@ -24,7 +24,7 @@
 #endif
 
 #if !defined(OS_IOS)
-#include "mojo/edk/embedder/embedder.h"  // nogncheck
+#include "mojo/core/embedder/embedder.h"  // nogncheck
 #endif
 
 namespace {
@@ -90,7 +90,7 @@
   GfxTestSuite test_suite(argc, argv);
 
 #if !defined(OS_IOS)
-  mojo::edk::Init();
+  mojo::core::Init();
 #endif
 
   return base::LaunchUnitTests(
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index 5fe64ed..72c8b2b 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -472,7 +472,7 @@
 
   if (use_ozone) {
     deps += [
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//services/service_manager/public/cpp/test:test_support",
       "//ui/ozone",
     ]
diff --git a/ui/gl/test/DEPS b/ui/gl/test/DEPS
index 7a0d934..b3e4762 100644
--- a/ui/gl/test/DEPS
+++ b/ui/gl/test/DEPS
@@ -2,6 +2,6 @@
   "+ui/base",
   "+ui/ozone/public",
   "+ui/platform_window/x11",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+services/service_manager/public",
 ]
diff --git a/ui/gl/test/run_all_unittests.cc b/ui/gl/test/run_all_unittests.cc
index 5219c05..0ecee04 100644
--- a/ui/gl/test/run_all_unittests.cc
+++ b/ui/gl/test/run_all_unittests.cc
@@ -17,7 +17,7 @@
 
 #if defined(USE_OZONE)
 #include "base/command_line.h"
-#include "mojo/edk/embedder/embedder.h"                   // nogncheck
+#include "mojo/core/embedder/embedder.h"                  // nogncheck
 #include "services/service_manager/public/cpp/service.h"  // nogncheck
 #include "services/service_manager/public/cpp/test/test_connector_factory.h"  // nogncheck
 #include "ui/ozone/public/ozone_platform.h"
@@ -117,7 +117,7 @@
 
 int main(int argc, char** argv) {
 #if defined(USE_OZONE)
-  mojo::edk::Init();
+  mojo::core::Init();
 #endif
 
   GlTestSuite test_suite(argc, argv);
diff --git a/ui/keyboard/BUILD.gn b/ui/keyboard/BUILD.gn
index 780c0c7..99dce13 100644
--- a/ui/keyboard/BUILD.gn
+++ b/ui/keyboard/BUILD.gn
@@ -157,7 +157,7 @@
     ":test_support",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//testing/gmock",
     "//testing/gtest",
     "//ui/aura:test_support",
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc
index ed869bb..4867327 100644
--- a/ui/keyboard/keyboard_controller.cc
+++ b/ui/keyboard/keyboard_controller.cc
@@ -255,10 +255,6 @@
   return g_keyboard_controller;
 }
 
-bool KeyboardController::keyboard_visible() const {
-  return state_ == KeyboardControllerState::SHOWN;
-}
-
 aura::Window* KeyboardController::GetKeyboardWindow() {
   return ui_ && ui_->HasKeyboardWindow() ? ui_->GetKeyboardWindow() : nullptr;
 }
@@ -287,7 +283,7 @@
 }
 
 void KeyboardController::MoveKeyboard(const gfx::Rect& new_bounds) {
-  DCHECK(keyboard_visible());
+  DCHECK(IsKeyboardVisible());
   SetKeyboardWindowBounds(new_bounds);
 }
 
@@ -301,7 +297,7 @@
 
   // We need to send out this notification only if keyboard is visible since
   // the keyboard window is resized even if keyboard is hidden.
-  if (keyboard_visible())
+  if (IsKeyboardVisible())
     NotifyKeyboardBoundsChanging(new_bounds);
 }
 
@@ -780,7 +776,7 @@
   // Overscroll is generally dependent on lock state, however, its behavior
   // temporarily overridden by a static field in certain lock screen contexts.
   // Furthermore, floating keyboard should never affect layout.
-  if (keyboard_visible() && !keyboard::IsKeyboardOverscrollEnabled() &&
+  if (!keyboard::IsKeyboardOverscrollEnabled() &&
       container_behavior_->GetType() != ContainerType::FLOATING &&
       container_behavior_->GetType() != ContainerType::FULLSCREEN) {
     return visual_bounds_in_screen_;
@@ -796,7 +792,7 @@
       .SetOccludedBounds(bounds);
 
   // Notify that only the occluded bounds have changed.
-  if (keyboard_visible())
+  if (IsKeyboardVisible())
     NotifyKeyboardBoundsChanging(visual_bounds_in_screen_);
 }
 
@@ -869,7 +865,7 @@
 }
 
 bool KeyboardController::IsKeyboardVisible() {
-  return keyboard_visible();
+  return state_ == KeyboardControllerState::SHOWN;
 }
 
 }  // namespace keyboard
diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h
index f9b6935..135a577 100644
--- a/ui/keyboard/keyboard_controller.h
+++ b/ui/keyboard/keyboard_controller.h
@@ -160,9 +160,6 @@
   // there is an ash::Shell).
   static bool HasInstance();
 
-  // Returns true if keyboard is in SHOWN or SHOWING state.
-  bool keyboard_visible() const;
-
   // Returns the bounds in screen for the visible portion of the keyboard. An
   // empty rectangle will get returned when the keyboard is hidden.
   const gfx::Rect& visual_bounds_in_screen() const {
@@ -228,6 +225,7 @@
       ui::InputMethodKeyboardControllerObserver* observer) override;
   void RemoveObserver(
       ui::InputMethodKeyboardControllerObserver* observer) override;
+  // Returns true if keyboard is in a SHOWN state.
   bool IsKeyboardVisible() override;
 
  private:
diff --git a/ui/keyboard/keyboard_controller_unittest.cc b/ui/keyboard/keyboard_controller_unittest.cc
index 4513b99..d8c3eda 100644
--- a/ui/keyboard/keyboard_controller_unittest.cc
+++ b/ui/keyboard/keyboard_controller_unittest.cc
@@ -265,7 +265,7 @@
     aura::Window* contents_window = controller_.ui()->GetKeyboardWindow();
     return (contents_window->GetRootWindow() == window->GetRootWindow() &&
             keyboard::IsKeyboardOverscrollEnabled() &&
-            contents_window->IsVisible() && controller_.keyboard_visible());
+            contents_window->IsVisible() && controller_.IsKeyboardVisible());
   }
 
   void RunLoop(base::RunLoop* run_loop) {
diff --git a/ui/keyboard/keyboard_util.cc b/ui/keyboard/keyboard_util.cc
index 00672bc7..b107861e 100644
--- a/ui/keyboard/keyboard_util.cc
+++ b/ui/keyboard/keyboard_util.cc
@@ -145,7 +145,7 @@
 bool IsKeyboardVisible() {
   auto* keyboard_controller = keyboard::KeyboardController::Get();
   return keyboard_controller->enabled() &&
-         keyboard_controller->keyboard_visible();
+         keyboard_controller->IsKeyboardVisible();
 }
 
 bool IsKeyboardOverscrollEnabled() {
diff --git a/ui/keyboard/test/DEPS b/ui/keyboard/test/DEPS
index 8f43aa8..f812cea 100644
--- a/ui/keyboard/test/DEPS
+++ b/ui/keyboard/test/DEPS
@@ -1,6 +1,6 @@
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
     "+ui/gl/test/gl_surface_test_support.h",
   ]
 }
diff --git a/ui/keyboard/test/run_all_unittests.cc b/ui/keyboard/test/run_all_unittests.cc
index 86b10203..749a3e70 100644
--- a/ui/keyboard/test/run_all_unittests.cc
+++ b/ui/keyboard/test/run_all_unittests.cc
@@ -8,7 +8,7 @@
 #include "base/path_service.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/env.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -50,7 +50,7 @@
 int main(int argc, char** argv) {
   KeyboardTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(
       argc, argv,
diff --git a/ui/latency/BUILD.gn b/ui/latency/BUILD.gn
index 28f05e7..6afee94 100644
--- a/ui/latency/BUILD.gn
+++ b/ui/latency/BUILD.gn
@@ -64,7 +64,7 @@
     ":latency",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk/test:run_all_unittests",
+    "//mojo/core/test:run_all_unittests",
     "//testing/gmock",
     "//testing/gtest",
   ]
@@ -95,7 +95,7 @@
     ":latency",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk/test:run_all_unittests",
+    "//mojo/core/test:run_all_unittests",
     "//testing/gmock",
     "//testing/gtest",
     "//testing/perf",
diff --git a/ui/message_center/BUILD.gn b/ui/message_center/BUILD.gn
index 29764da5..1092359 100644
--- a/ui/message_center/BUILD.gn
+++ b/ui/message_center/BUILD.gn
@@ -209,7 +209,7 @@
       ":test_support",
       "//base",
       "//base/test:test_support",
-      "//mojo/edk",
+      "//mojo/core/embedder",
       "//skia",
       "//testing/gmock",
       "//testing/gtest",
@@ -236,7 +236,7 @@
     if (is_chromeos) {
       sources += [ "public/mojo/struct_traits_unittest.cc" ]
       deps += [
-        "//mojo/edk",
+        "//mojo/core/embedder",
         "//ui/message_center/public/mojo:test_interfaces",
       ]
     }
diff --git a/ui/message_center/test/DEPS b/ui/message_center/test/DEPS
index 35b8a8e..43c74c9 100644
--- a/ui/message_center/test/DEPS
+++ b/ui/message_center/test/DEPS
@@ -1,4 +1,4 @@
 include_rules = [
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+ui/gl/test/gl_surface_test_support.h",  # To initialize GL for tests.
 ]
diff --git a/ui/message_center/test/run_all_unittests.cc b/ui/message_center/test/run_all_unittests.cc
index 347c71d..2d9c832 100644
--- a/ui/message_center/test/run_all_unittests.cc
+++ b/ui/message_center/test/run_all_unittests.cc
@@ -10,7 +10,7 @@
 #include "base/test/test_discardable_memory_allocator.h"
 #include "base/test/test_suite.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
@@ -60,7 +60,7 @@
 
 int main(int argc, char** argv) {
   MessageCenterTestSuite test_suite(argc, argv);
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(argc, argv,
                                base::BindOnce(&MessageCenterTestSuite::Run,
diff --git a/ui/ozone/BUILD.gn b/ui/ozone/BUILD.gn
index f12912ef..3363568 100644
--- a/ui/ozone/BUILD.gn
+++ b/ui/ozone/BUILD.gn
@@ -206,7 +206,7 @@
   configs += [ "//build/config:precompiled_headers" ]
 
   deps = [
-    "//mojo/edk/test:run_all_unittests",
+    "//mojo/core/test:run_all_unittests",
     "//mojo/public/cpp/bindings",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/ui/ozone/DEPS b/ui/ozone/DEPS
index 96d5d9eb..261e887 100644
--- a/ui/ozone/DEPS
+++ b/ui/ozone/DEPS
@@ -13,6 +13,6 @@
 ]
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder/embedder.h",
+    "+mojo/core/embedder/embedder.h",
   ],
 }
diff --git a/ui/snapshot/BUILD.gn b/ui/snapshot/BUILD.gn
index 840df0e7..5ceaabcb 100644
--- a/ui/snapshot/BUILD.gn
+++ b/ui/snapshot/BUILD.gn
@@ -100,7 +100,7 @@
     ":snapshot",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//skia",
     "//testing/gtest",
     "//ui/base",
diff --git a/ui/snapshot/test/DEPS b/ui/snapshot/test/DEPS
index 101f832..e3fd4c76e 100644
--- a/ui/snapshot/test/DEPS
+++ b/ui/snapshot/test/DEPS
@@ -1,5 +1,5 @@
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ]
 }
diff --git a/ui/snapshot/test/run_all_unittests.cc b/ui/snapshot/test/run_all_unittests.cc
index 2ffcecb..9c1aceb 100644
--- a/ui/snapshot/test/run_all_unittests.cc
+++ b/ui/snapshot/test/run_all_unittests.cc
@@ -5,11 +5,11 @@
 #include "base/bind.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/compositor/test/test_suite.h"
 
 int main(int argc, char** argv) {
-  mojo::edk::Init();
+  mojo::core::Init();
 
 #if defined(USE_AURA)
   ui::test::CompositorTestSuite test_suite(argc, argv);
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index 6826f027..97566fb 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -831,7 +831,7 @@
     "//base/test:test_support",
     "//gpu/ipc/service",
     "//ipc:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//skia",
     "//testing/gtest",
     "//ui/base",
@@ -1147,7 +1147,7 @@
 
   deps = [
     ":views_unittests_sources",
-    "//mojo/edk",
+    "//mojo/core/embedder",
   ]
 }
 
@@ -1165,7 +1165,7 @@
     ":views",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//skia",
     "//testing/gtest",
     "//ui/base:test_support",
@@ -1224,7 +1224,7 @@
     ":test_support",
     "//base/test:test_support",
     "//cc/base:base",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//testing/perf",
     "//ui/resources:ui_test_pak",
   ]
diff --git a/ui/views/DEPS b/ui/views/DEPS
index e6f8d86..39d2ec74 100644
--- a/ui/views/DEPS
+++ b/ui/views/DEPS
@@ -31,10 +31,10 @@
     "+ui/wm/test"
   ],
   "run_all_unittests_main\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ],
   "views_perftests\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ],
   "view_unittest\.cc": [
     "+cc/playback"
diff --git a/ui/views/accessibility/DEPS b/ui/views/accessibility/DEPS
index 62e6a66..35ddbecf 100644
--- a/ui/views/accessibility/DEPS
+++ b/ui/views/accessibility/DEPS
@@ -4,6 +4,6 @@
 
 specific_include_rules = {
   "ax_system_caret_win_interactive_uitest\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ]
 }
diff --git a/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc b/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc
index d3821559..84b893f 100644
--- a/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc
+++ b/ui/views/accessibility/ax_system_caret_win_interactive_uitest.cc
@@ -10,7 +10,7 @@
 #include "base/path_service.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/scoped_variant.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_tree_host.h"
@@ -36,7 +36,7 @@
   ~AXSystemCaretWinTest() override {}
 
   void SetUp() override {
-    mojo::edk::Init();
+    mojo::core::Init();
     gl::GLSurfaceTestSupport::InitializeOneOff();
     ui::RegisterPathProvider();
     base::FilePath ui_test_pak_path;
diff --git a/ui/views/mus/BUILD.gn b/ui/views/mus/BUILD.gn
index 71b465e..f9b1fe38 100644
--- a/ui/views/mus/BUILD.gn
+++ b/ui/views/mus/BUILD.gn
@@ -122,7 +122,7 @@
     ":mus",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//services/catalog:lib",
     "//services/service_manager/background:lib",
     "//services/service_manager/public/cpp",
@@ -248,7 +248,7 @@
     ":mus",
     ":test_support",
     "//base",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//testing/gmock",
     "//testing/gtest",
     "//ui/aura",
diff --git a/ui/views/mus/DEPS b/ui/views/mus/DEPS
index 333b7ca..8953b55 100644
--- a/ui/views/mus/DEPS
+++ b/ui/views/mus/DEPS
@@ -3,7 +3,7 @@
   "+components/gpu",
   "+mojo/cc",
   "+mojo/converters",
-  "+mojo/edk/embedder",
+  "+mojo/core/embedder",
   "+mojo/public",
   "+services/catalog",
   "+services/service_manager/public",
diff --git a/ui/views/mus/views_mus_test_suite.cc b/ui/views/mus/views_mus_test_suite.cc
index 304d7625..aee90802 100644
--- a/ui/views/mus/views_mus_test_suite.cc
+++ b/ui/views/mus/views_mus_test_suite.cc
@@ -15,8 +15,8 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/simple_thread.h"
 #include "base/threading/thread.h"
-#include "mojo/edk/embedder/embedder.h"
-#include "mojo/edk/embedder/scoped_ipc_support.h"
+#include "mojo/core/embedder/embedder.h"
+#include "mojo/core/embedder/scoped_ipc_support.h"
 #include "services/catalog/catalog.h"
 #include "services/service_manager/background/background_service_manager.h"
 #include "services/service_manager/public/cpp/connector.h"
@@ -72,12 +72,12 @@
         ipc_thread_("IPC thread") {
     catalog::Catalog::LoadDefaultCatalogManifest(
         base::FilePath(kCatalogFilename));
-    mojo::edk::Init();
+    mojo::core::Init();
     ipc_thread_.StartWithOptions(
         base::Thread::Options(base::MessageLoop::TYPE_IO, 0));
-    ipc_support_ = std::make_unique<mojo::edk::ScopedIPCSupport>(
+    ipc_support_ = std::make_unique<mojo::core::ScopedIPCSupport>(
         ipc_thread_.task_runner(),
-        mojo::edk::ScopedIPCSupport::ShutdownPolicy::CLEAN);
+        mojo::core::ScopedIPCSupport::ShutdownPolicy::CLEAN);
 
     base::WaitableEvent wait(base::WaitableEvent::ResetPolicy::AUTOMATIC,
                              base::WaitableEvent::InitialState::NOT_SIGNALED);
@@ -162,7 +162,7 @@
 
   base::Thread thread_;
   base::Thread ipc_thread_;
-  std::unique_ptr<mojo::edk::ScopedIPCSupport> ipc_support_;
+  std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
   std::unique_ptr<service_manager::BackgroundServiceManager>
       background_service_manager_;
   std::unique_ptr<service_manager::ServiceContext> context_;
diff --git a/ui/views/run_all_unittests_main.cc b/ui/views/run_all_unittests_main.cc
index 51d21871..5e781047 100644
--- a/ui/views/run_all_unittests_main.cc
+++ b/ui/views/run_all_unittests_main.cc
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/views/views_test_suite.h"
 
 int main(int argc, char** argv) {
-  mojo::edk::Init();
+  mojo::core::Init();
   return views::ViewsTestSuite(argc, argv).RunTests();
 }
diff --git a/ui/views/test/DEPS b/ui/views/test/DEPS
index ec5862e..d47da7cf 100644
--- a/ui/views/test/DEPS
+++ b/ui/views/test/DEPS
@@ -4,6 +4,6 @@
 
 specific_include_rules = {
   "views_interactive_ui_test_base\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ]
 }
diff --git a/ui/views/test/views_interactive_ui_test_base.cc b/ui/views/test/views_interactive_ui_test_base.cc
index cb8aa01..eb9377c 100644
--- a/ui/views/test/views_interactive_ui_test_base.cc
+++ b/ui/views/test/views_interactive_ui_test_base.cc
@@ -5,7 +5,7 @@
 #include "ui/views/test/views_interactive_ui_test_base.h"
 
 #include "base/path_service.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/base/ui_base_paths.h"
 #include "ui/gl/test/gl_surface_test_support.h"
@@ -21,7 +21,7 @@
   // Mojo is initialized here similar to how each browser test case initializes
   // Mojo when starting. This only works because each interactive_ui_test runs
   // in a new process.
-  mojo::edk::Init();
+  mojo::core::Init();
 
   gl::GLSurfaceTestSupport::InitializeOneOff();
   ui::RegisterPathProvider();
diff --git a/ui/views/views_perftests.cc b/ui/views/views_perftests.cc
index 6740c887..3e06f18 100644
--- a/ui/views/views_perftests.cc
+++ b/ui/views/views_perftests.cc
@@ -3,12 +3,12 @@
 // found in the LICENSE file.
 
 #include "base/test/launcher/unit_test_launcher.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/views/views_test_suite.h"
 
 int main(int argc, char** argv) {
   views::ViewsTestSuite test_suite(argc, argv);
-  mojo::edk::Init();
+  mojo::core::Init();
   return base::LaunchUnitTestsSerially(
       argc, argv,
       base::BindOnce(&views::ViewsTestSuite::Run,
diff --git a/ui/views/widget/DEPS b/ui/views/widget/DEPS
index 74d84ca3..a244cf72 100644
--- a/ui/views/widget/DEPS
+++ b/ui/views/widget/DEPS
@@ -1,5 +1,5 @@
 specific_include_rules = {
   "widget_interactive_uitest\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ]
 }
diff --git a/ui/views/widget/widget_interactive_uitest.cc b/ui/views/widget/widget_interactive_uitest.cc
index 83093ff..01e8570 100644
--- a/ui/views/widget/widget_interactive_uitest.cc
+++ b/ui/views/widget/widget_interactive_uitest.cc
@@ -16,7 +16,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/win/windows_version.h"
 #include "build/build_config.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "ui/base/ime/input_method.h"
 #include "ui/base/ime/text_input_client.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -281,7 +281,7 @@
       // Mojo is initialized here similar to how each browser test case
       // initializes Mojo when starting. This only works because each
       // interactive_ui_test runs in a new process.
-      mojo::edk::Init();
+      mojo::core::Init();
 
       gl::GLSurfaceTestSupport::InitializeOneOff();
       ui::RegisterPathProvider();
diff --git a/ui/wm/BUILD.gn b/ui/wm/BUILD.gn
index f833d4c..bea3a4e2 100644
--- a/ui/wm/BUILD.gn
+++ b/ui/wm/BUILD.gn
@@ -145,7 +145,7 @@
     ":wm",
     "//base",
     "//base/test:test_support",
-    "//mojo/edk",
+    "//mojo/core/embedder",
     "//skia",
     "//testing/gtest",
     "//ui/aura:test_support",
diff --git a/ui/wm/test/DEPS b/ui/wm/test/DEPS
index e6b51d4..72e640ce 100644
--- a/ui/wm/test/DEPS
+++ b/ui/wm/test/DEPS
@@ -11,6 +11,6 @@
 
 specific_include_rules = {
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ]
 }
diff --git a/ui/wm/test/run_all_unittests.cc b/ui/wm/test/run_all_unittests.cc
index 445f963..5d3bb4e 100644
--- a/ui/wm/test/run_all_unittests.cc
+++ b/ui/wm/test/run_all_unittests.cc
@@ -11,7 +11,7 @@
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_discardable_memory_allocator.h"
 #include "base/test/test_suite.h"
-#include "mojo/edk/embedder/embedder.h"
+#include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/aura/env.h"
 #include "ui/base/resource/resource_bundle.h"
@@ -53,7 +53,7 @@
 int main(int argc, char** argv) {
   WMTestSuite test_suite(argc, argv);
 
-  mojo::edk::Init();
+  mojo::core::Init();
 
   return base::LaunchUnitTests(
       argc, argv,
diff --git a/url/BUILD.gn b/url/BUILD.gn
index c4deb10..57bbe16 100644
--- a/url/BUILD.gn
+++ b/url/BUILD.gn
@@ -168,8 +168,7 @@
 
   if (!is_ios) {
     deps += [
-      "//mojo/edk",
-      "//mojo/edk/test:test_support",
+      "//mojo/core/embedder",
       "//url/mojom:test_url_mojom_gurl",
     ]
   }
diff --git a/url/DEPS b/url/DEPS
index 9591925b..c43ecab 100644
--- a/url/DEPS
+++ b/url/DEPS
@@ -14,6 +14,6 @@
     "+third_party/icu",
   ],
   "run_all_unittests\.cc": [
-    "+mojo/edk/embedder",
+    "+mojo/core/embedder",
   ],
 }
diff --git a/url/run_all_unittests.cc b/url/run_all_unittests.cc
index 02732cc..0a972111 100644
--- a/url/run_all_unittests.cc
+++ b/url/run_all_unittests.cc
@@ -11,14 +11,14 @@
 #include "build/build_config.h"
 
 #if !defined(OS_IOS)
-#include "mojo/edk/embedder/embedder.h"  // nogncheck
+#include "mojo/core/embedder/embedder.h"  // nogncheck
 #endif
 
 int main(int argc, char** argv) {
   base::TestSuite test_suite(argc, argv);
 
 #if !defined(OS_IOS)
-  mojo::edk::Init();
+  mojo::core::Init();
 #endif
 
   return base::LaunchUnitTests(