diff --git a/chrome/browser/background_sync/background_sync_permission_context.cc b/chrome/browser/background_sync/background_sync_permission_context.cc
index 4a9f16df..84350dd 100644
--- a/chrome/browser/background_sync/background_sync_permission_context.cc
+++ b/chrome/browser/background_sync/background_sync_permission_context.cc
@@ -6,12 +6,10 @@
 
 #include "base/logging.h"
 #include "components/content_settings/core/common/content_settings_types.h"
-#include "content/public/browser/permission_type.h"
 
 BackgroundSyncPermissionContext::BackgroundSyncPermissionContext(
     Profile* profile)
     : PermissionContextBase(profile,
-                            content::PermissionType::BACKGROUND_SYNC,
                             CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC) {}
 
 void BackgroundSyncPermissionContext::CancelPermissionRequest(
diff --git a/chrome/browser/browsing_data/browsing_data_remover_impl_unittest.cc b/chrome/browser/browsing_data/browsing_data_remover_impl_unittest.cc
index 4f47cc65..d7a64313 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_impl_unittest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_impl_unittest.cc
@@ -39,7 +39,6 @@
 #include "content/public/browser/cookie_store_factory.h"
 #include "content/public/browser/dom_storage_context.h"
 #include "content/public/browser/local_storage_usage_info.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/test/mock_download_manager.h"
 #include "content/public/test/test_browser_thread.h"
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
index 26ddb051..64a954a 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate_unittest.cc
@@ -558,20 +558,20 @@
   explicit RemovePermissionPromptCountsTest(TestingProfile* profile)
       : autoblocker_(PermissionDecisionAutoBlocker::GetForProfile(profile)) {}
 
-  int GetDismissCount(const GURL& url, content::PermissionType permission) {
+  int GetDismissCount(const GURL& url, ContentSettingsType permission) {
     return autoblocker_->GetDismissCount(url, permission);
   }
 
-  int GetIgnoreCount(const GURL& url, content::PermissionType permission) {
+  int GetIgnoreCount(const GURL& url, ContentSettingsType permission) {
     return autoblocker_->GetIgnoreCount(url, permission);
   }
 
-  int RecordIgnore(const GURL& url, content::PermissionType permission) {
+  int RecordIgnore(const GURL& url, ContentSettingsType permission) {
     return autoblocker_->RecordIgnore(url, permission);
   }
 
   bool ShouldChangeDismissalToBlock(const GURL& url,
-                                    content::PermissionType permission) {
+                                    ContentSettingsType permission) {
     return autoblocker_->RecordDismissAndEmbargo(url, permission);
   }
 
@@ -1575,17 +1575,17 @@
   {
     // Test REMOVE_HISTORY.
     EXPECT_EQ(1, tester.RecordIgnore(kOrigin1,
-                                     content::PermissionType::GEOLOCATION));
+                                     CONTENT_SETTINGS_TYPE_GEOLOCATION));
     EXPECT_EQ(2, tester.RecordIgnore(kOrigin1,
-                                     content::PermissionType::GEOLOCATION));
+                                     CONTENT_SETTINGS_TYPE_GEOLOCATION));
     EXPECT_EQ(1, tester.RecordIgnore(kOrigin1,
-                                     content::PermissionType::NOTIFICATIONS));
+                                     CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
     tester.ShouldChangeDismissalToBlock(kOrigin1,
-                                        content::PermissionType::MIDI_SYSEX);
+                                        CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
     EXPECT_EQ(1, tester.RecordIgnore(kOrigin2,
-                                     content::PermissionType::DURABLE_STORAGE));
+                                     CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
     tester.ShouldChangeDismissalToBlock(kOrigin2,
-                                        content::PermissionType::NOTIFICATIONS);
+                                        CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
 
     BlockUntilOriginDataRemoved(AnHourAgo(), base::Time::Max(),
                                 BrowsingDataRemover::REMOVE_SITE_USAGE_DATA,
@@ -1593,45 +1593,45 @@
 
     // kOrigin1 should be gone, but kOrigin2 remains.
     EXPECT_EQ(0, tester.GetIgnoreCount(kOrigin1,
-                                       content::PermissionType::GEOLOCATION));
+                                       CONTENT_SETTINGS_TYPE_GEOLOCATION));
     EXPECT_EQ(0, tester.GetIgnoreCount(kOrigin1,
-                                       content::PermissionType::NOTIFICATIONS));
+                                       CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
     EXPECT_EQ(0, tester.GetDismissCount(kOrigin1,
-                                        content::PermissionType::MIDI_SYSEX));
+                                        CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
     EXPECT_EQ(1, tester.GetIgnoreCount(
-                     kOrigin2, content::PermissionType::DURABLE_STORAGE));
+                     kOrigin2, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
     EXPECT_EQ(1, tester.GetDismissCount(
-                     kOrigin2, content::PermissionType::NOTIFICATIONS));
+                     kOrigin2, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 
     BlockUntilBrowsingDataRemoved(AnHourAgo(), base::Time::Max(),
                                   BrowsingDataRemover::REMOVE_HISTORY, false);
 
     // Everything should be gone.
     EXPECT_EQ(0, tester.GetIgnoreCount(kOrigin1,
-                                       content::PermissionType::GEOLOCATION));
+                                       CONTENT_SETTINGS_TYPE_GEOLOCATION));
     EXPECT_EQ(0, tester.GetIgnoreCount(kOrigin1,
-                                       content::PermissionType::NOTIFICATIONS));
+                                       CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
     EXPECT_EQ(0, tester.GetDismissCount(kOrigin1,
-                                        content::PermissionType::MIDI_SYSEX));
+                                        CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
     EXPECT_EQ(0, tester.GetIgnoreCount(
-                     kOrigin2, content::PermissionType::DURABLE_STORAGE));
+                     kOrigin2, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
     EXPECT_EQ(0, tester.GetDismissCount(
-                     kOrigin2, content::PermissionType::NOTIFICATIONS));
+                     kOrigin2, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
   }
   {
     // Test REMOVE_SITE_DATA.
     EXPECT_EQ(1, tester.RecordIgnore(kOrigin1,
-                                     content::PermissionType::GEOLOCATION));
+                                     CONTENT_SETTINGS_TYPE_GEOLOCATION));
     EXPECT_EQ(2, tester.RecordIgnore(kOrigin1,
-                                     content::PermissionType::GEOLOCATION));
+                                     CONTENT_SETTINGS_TYPE_GEOLOCATION));
     EXPECT_EQ(1, tester.RecordIgnore(kOrigin1,
-                                     content::PermissionType::NOTIFICATIONS));
+                                     CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
     tester.ShouldChangeDismissalToBlock(kOrigin1,
-                                        content::PermissionType::MIDI_SYSEX);
+                                        CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
     EXPECT_EQ(1, tester.RecordIgnore(kOrigin2,
-                                     content::PermissionType::DURABLE_STORAGE));
+                                     CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
     tester.ShouldChangeDismissalToBlock(kOrigin2,
-                                        content::PermissionType::NOTIFICATIONS);
+                                        CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
 
     BlockUntilOriginDataRemoved(AnHourAgo(), base::Time::Max(),
                                 BrowsingDataRemover::REMOVE_SITE_USAGE_DATA,
@@ -1639,15 +1639,15 @@
 
     // kOrigin2 should be gone, but kOrigin1 remains.
     EXPECT_EQ(2, tester.GetIgnoreCount(kOrigin1,
-                                       content::PermissionType::GEOLOCATION));
+                                       CONTENT_SETTINGS_TYPE_GEOLOCATION));
     EXPECT_EQ(1, tester.GetIgnoreCount(kOrigin1,
-                                       content::PermissionType::NOTIFICATIONS));
+                                       CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
     EXPECT_EQ(1, tester.GetDismissCount(kOrigin1,
-                                        content::PermissionType::MIDI_SYSEX));
+                                        CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
     EXPECT_EQ(0, tester.GetIgnoreCount(
-                     kOrigin2, content::PermissionType::DURABLE_STORAGE));
+                     kOrigin2, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
     EXPECT_EQ(0, tester.GetDismissCount(
-                     kOrigin2, content::PermissionType::NOTIFICATIONS));
+                     kOrigin2, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 
     BlockUntilBrowsingDataRemoved(AnHourAgo(), base::Time::Max(),
                                   BrowsingDataRemover::REMOVE_SITE_USAGE_DATA,
@@ -1655,15 +1655,15 @@
 
     // Everything should be gone.
     EXPECT_EQ(0, tester.GetIgnoreCount(kOrigin1,
-                                       content::PermissionType::GEOLOCATION));
+                                       CONTENT_SETTINGS_TYPE_GEOLOCATION));
     EXPECT_EQ(0, tester.GetIgnoreCount(kOrigin1,
-                                       content::PermissionType::NOTIFICATIONS));
+                                       CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
     EXPECT_EQ(0, tester.GetDismissCount(kOrigin1,
-                                        content::PermissionType::MIDI_SYSEX));
+                                        CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
     EXPECT_EQ(0, tester.GetIgnoreCount(
-                     kOrigin2, content::PermissionType::DURABLE_STORAGE));
+                     kOrigin2, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
     EXPECT_EQ(0, tester.GetDismissCount(
-                     kOrigin2, content::PermissionType::NOTIFICATIONS));
+                     kOrigin2, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
   }
 }
 
diff --git a/chrome/browser/chromeos/attestation/platform_verification_flow.cc b/chrome/browser/chromeos/attestation/platform_verification_flow.cc
index d13221b..17fb0c6 100644
--- a/chrome/browser/chromeos/attestation/platform_verification_flow.cc
+++ b/chrome/browser/chromeos/attestation/platform_verification_flow.cc
@@ -27,10 +27,10 @@
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/user_manager/user.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/user_metrics.h"
@@ -116,7 +116,7 @@
         PermissionManager::Get(
             Profile::FromBrowserContext(web_contents->GetBrowserContext()))
             ->GetPermissionStatus(
-                content::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
+                CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER,
                 requesting_origin, embedding_origin);
 
     return status == blink::mojom::PermissionStatus::GRANTED;
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc
index 6ca009a5..7615b12 100644
--- a/chrome/browser/extensions/service_worker_apitest.cc
+++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -19,11 +19,11 @@
 #include "chrome/browser/push_messaging/push_messaging_service_impl.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/gcm_driver/instance_id/fake_gcm_driver_for_instance_id.h"
 #include "components/version_info/version_info.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/navigation_entry.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/service_worker_context.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
@@ -225,7 +225,7 @@
     DesktopNotificationProfileUtil::GrantPermission(profile(), origin);
     ASSERT_EQ(blink::mojom::PermissionStatus::GRANTED,
               PermissionManager::Get(profile())->GetPermissionStatus(
-                  content::PermissionType::NOTIFICATIONS, origin, origin));
+                  CONTENT_SETTINGS_TYPE_NOTIFICATIONS, origin, origin));
   }
 
   PushMessagingAppIdentifier GetAppIdentifierForServiceWorkerRegistration(
diff --git a/chrome/browser/geolocation/geolocation_infobar_delegate_android.cc b/chrome/browser/geolocation/geolocation_infobar_delegate_android.cc
index de62c5c..5fc4c43f 100644
--- a/chrome/browser/geolocation/geolocation_infobar_delegate_android.cc
+++ b/chrome/browser/geolocation/geolocation_infobar_delegate_android.cc
@@ -13,7 +13,6 @@
     Profile* profile,
     const PermissionSetCallback& callback)
     : PermissionInfoBarDelegate(requesting_frame,
-                                content::PermissionType::GEOLOCATION,
                                 CONTENT_SETTINGS_TYPE_GEOLOCATION,
                                 user_gesture,
                                 profile,
diff --git a/chrome/browser/geolocation/geolocation_permission_context.cc b/chrome/browser/geolocation/geolocation_permission_context.cc
index 38ab762b..0283b6c 100644
--- a/chrome/browser/geolocation/geolocation_permission_context.cc
+++ b/chrome/browser/geolocation/geolocation_permission_context.cc
@@ -9,7 +9,6 @@
 #include "chrome/browser/permissions/permission_request_id.h"
 #include "chrome/browser/profiles/profile.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "device/geolocation/geolocation_provider.h"
@@ -17,7 +16,6 @@
 
 GeolocationPermissionContext::GeolocationPermissionContext(Profile* profile)
     : PermissionContextBase(profile,
-                            content::PermissionType::GEOLOCATION,
                             CONTENT_SETTINGS_TYPE_GEOLOCATION),
       extensions_context_(profile) {}
 
diff --git a/chrome/browser/geolocation/geolocation_permission_context_unittest.cc b/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
index 6385a45..d1af54d 100644
--- a/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
+++ b/chrome/browser/geolocation/geolocation_permission_context_unittest.cc
@@ -288,7 +288,7 @@
   TabSpecificContentSettings::CreateForWebContents(web_contents());
   geolocation_permission_context_ = static_cast<GeolocationPermissionContext*>(
       PermissionManager::Get(profile())->GetPermissionContext(
-          content::PermissionType::GEOLOCATION));
+          CONTENT_SETTINGS_TYPE_GEOLOCATION));
 #if defined(OS_ANDROID)
   static_cast<GeolocationPermissionContextAndroid*>(
       geolocation_permission_context_)
diff --git a/chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc b/chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc
index a1e8d93..8228d9a5 100644
--- a/chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc
+++ b/chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc
@@ -11,7 +11,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/features.h"
 #include "chrome/common/render_messages.h"
-#include "content/public/browser/permission_type.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
@@ -226,7 +226,7 @@
   Profile* profile = Profile::FromBrowserContext(
       web_view_guest()->browser_context());
   PermissionManager::Get(profile)->RequestPermission(
-      content::PermissionType::GEOLOCATION, web_contents->GetMainFrame(),
+      CONTENT_SETTINGS_TYPE_GEOLOCATION, web_contents->GetMainFrame(),
       web_view_guest()
           ->embedder_web_contents()
           ->GetLastCommittedURL()
diff --git a/chrome/browser/media/midi_permission_context.cc b/chrome/browser/media/midi_permission_context.cc
index f4987df5..218f9b9 100644
--- a/chrome/browser/media/midi_permission_context.cc
+++ b/chrome/browser/media/midi_permission_context.cc
@@ -7,12 +7,10 @@
 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/browser/permissions/permission_request_id.h"
 #include "content/public/browser/child_process_security_policy.h"
-#include "content/public/browser/permission_type.h"
 #include "url/gurl.h"
 
 MidiPermissionContext::MidiPermissionContext(Profile* profile)
     : PermissionContextBase(profile,
-                            content::PermissionType::MIDI_SYSEX,
                             CONTENT_SETTINGS_TYPE_MIDI_SYSEX) {}
 
 MidiPermissionContext::~MidiPermissionContext() {
diff --git a/chrome/browser/media/midi_permission_infobar_delegate_android.cc b/chrome/browser/media/midi_permission_infobar_delegate_android.cc
index bf9d3b04..bf33bd7 100644
--- a/chrome/browser/media/midi_permission_infobar_delegate_android.cc
+++ b/chrome/browser/media/midi_permission_infobar_delegate_android.cc
@@ -13,7 +13,6 @@
     Profile* profile,
     const PermissionSetCallback& callback)
     : PermissionInfoBarDelegate(requesting_frame,
-                                content::PermissionType::MIDI_SYSEX,
                                 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
                                 user_gesture,
                                 profile,
diff --git a/chrome/browser/media/protected_media_identifier_infobar_delegate_android.cc b/chrome/browser/media/protected_media_identifier_infobar_delegate_android.cc
index 0c98b81..6720d7a 100644
--- a/chrome/browser/media/protected_media_identifier_infobar_delegate_android.cc
+++ b/chrome/browser/media/protected_media_identifier_infobar_delegate_android.cc
@@ -18,7 +18,6 @@
         const PermissionSetCallback& callback)
     : PermissionInfoBarDelegate(
           requesting_frame,
-          content::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
           CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER,
           user_gesture,
           profile,
diff --git a/chrome/browser/media/protected_media_identifier_permission_context.cc b/chrome/browser/media/protected_media_identifier_permission_context.cc
index ea8bd5c..1dbfcc9 100644
--- a/chrome/browser/media/protected_media_identifier_permission_context.cc
+++ b/chrome/browser/media/protected_media_identifier_permission_context.cc
@@ -12,7 +12,6 @@
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/user_metrics.h"
 #include "content/public/browser/web_contents.h"
@@ -37,7 +36,6 @@
 ProtectedMediaIdentifierPermissionContext::
     ProtectedMediaIdentifierPermissionContext(Profile* profile)
     : PermissionContextBase(profile,
-                            content::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
                             CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER)
 #if defined(OS_CHROMEOS)
       ,
diff --git a/chrome/browser/media/webrtc/media_permission.cc b/chrome/browser/media/webrtc/media_permission.cc
index d05a130..278f7ed 100644
--- a/chrome/browser/media/webrtc/media_permission.cc
+++ b/chrome/browser/media/webrtc/media_permission.cc
@@ -11,25 +11,10 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
 #include "content/public/browser/permission_manager.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/common/url_constants.h"
 #include "extensions/common/constants.h"
 #include "third_party/WebKit/public/platform/modules/permissions/permission_status.mojom.h"
 
-namespace {
-
-content::PermissionType ContentSettingsTypeToPermission(
-    ContentSettingsType content_setting) {
-  if (content_setting == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC) {
-    return content::PermissionType::AUDIO_CAPTURE;
-  } else {
-    DCHECK_EQ(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, content_setting);
-    return content::PermissionType::VIDEO_CAPTURE;
-  }
-}
-
-}  // namespace
-
 MediaPermission::MediaPermission(ContentSettingsType content_type,
                                  const GURL& requesting_origin,
                                  const GURL& embedding_origin,
@@ -48,12 +33,10 @@
     return CONTENT_SETTING_BLOCK;
   }
 
-  content::PermissionType permission_type =
-      ContentSettingsTypeToPermission(content_type_);
   PermissionManager* permission_manager = PermissionManager::Get(profile_);
 
   // Find out if the kill switch is on. Set the denial reason to kill switch.
-  if (permission_manager->IsPermissionKillSwitchOn(permission_type)) {
+  if (permission_manager->IsPermissionKillSwitchOn(content_type_)) {
     *denial_reason = content::MEDIA_DEVICE_KILL_SWITCH_ON;
     return CONTENT_SETTING_BLOCK;
   }
@@ -61,7 +44,7 @@
   // Check policy and content settings.
   blink::mojom::PermissionStatus status =
       permission_manager->GetPermissionStatus(
-          permission_type, requesting_origin_, embedding_origin_);
+          content_type_, requesting_origin_, embedding_origin_);
   switch (status) {
     case blink::mojom::PermissionStatus::DENIED:
       *denial_reason = content::MEDIA_DEVICE_PERMISSION_DENIED;
diff --git a/chrome/browser/media/webrtc/media_stream_device_permission_context.cc b/chrome/browser/media/webrtc/media_stream_device_permission_context.cc
index 8220b34..2d34b90 100644
--- a/chrome/browser/media/webrtc/media_stream_device_permission_context.cc
+++ b/chrome/browser/media/webrtc/media_stream_device_permission_context.cc
@@ -13,9 +13,8 @@
 
 MediaStreamDevicePermissionContext::MediaStreamDevicePermissionContext(
     Profile* profile,
-    const content::PermissionType permission_type,
     const ContentSettingsType content_settings_type)
-    : PermissionContextBase(profile, permission_type, content_settings_type),
+    : PermissionContextBase(profile, content_settings_type),
       content_settings_type_(content_settings_type) {
   DCHECK(content_settings_type_ == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC ||
          content_settings_type_ == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
diff --git a/chrome/browser/media/webrtc/media_stream_device_permission_context.h b/chrome/browser/media/webrtc/media_stream_device_permission_context.h
index b9ccf177..274edcf1 100644
--- a/chrome/browser/media/webrtc/media_stream_device_permission_context.h
+++ b/chrome/browser/media/webrtc/media_stream_device_permission_context.h
@@ -8,18 +8,12 @@
 #include "base/macros.h"
 #include "chrome/browser/permissions/permission_context_base.h"
 #include "components/content_settings/core/common/content_settings_types.h"
-#include "content/public/browser/permission_type.h"
 
 // Common class which handles the mic and camera permissions.
-// MediaStreamMicPermissionContextFactory and
-// MediaStreamCameraPermissionContextFactory will instantiate this with
-// corresponding |permission_type|.
 class MediaStreamDevicePermissionContext : public PermissionContextBase {
  public:
-  MediaStreamDevicePermissionContext(
-      Profile* profile,
-      const content::PermissionType permission_type,
-      const ContentSettingsType content_settings_type);
+  MediaStreamDevicePermissionContext(Profile* profile,
+                                     ContentSettingsType content_settings_type);
   ~MediaStreamDevicePermissionContext() override;
 
   // PermissionContextBase:
diff --git a/chrome/browser/media/webrtc/media_stream_device_permission_context_unittest.cc b/chrome/browser/media/webrtc/media_stream_device_permission_context_unittest.cc
index a373ba0..97a2d10 100644
--- a/chrome/browser/media/webrtc/media_stream_device_permission_context_unittest.cc
+++ b/chrome/browser/media/webrtc/media_stream_device_permission_context_unittest.cc
@@ -15,7 +15,6 @@
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_types.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/web_contents_tester.h"
@@ -29,13 +28,8 @@
 class TestPermissionContext : public MediaStreamDevicePermissionContext {
  public:
   TestPermissionContext(Profile* profile,
-                        const ContentSettingsType permission_type)
-      : MediaStreamDevicePermissionContext(
-            profile,
-            permission_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA
-                ? content::PermissionType::VIDEO_CAPTURE
-                : content::PermissionType::AUDIO_CAPTURE,
-            permission_type) {}
+                        const ContentSettingsType content_settings_type)
+      : MediaStreamDevicePermissionContext(profile, content_settings_type) {}
 
   ~TestPermissionContext() override {}
 };
@@ -49,8 +43,8 @@
  protected:
   MediaStreamDevicePermissionContextTests() = default;
 
-  void TestInsecureQueryingUrl(ContentSettingsType permission_type) {
-    TestPermissionContext permission_context(profile(), permission_type);
+  void TestInsecureQueryingUrl(ContentSettingsType content_settings_type) {
+    TestPermissionContext permission_context(profile(), content_settings_type);
     GURL insecure_url("http://www.example.com");
     GURL secure_url("https://www.example.com");
 
@@ -59,20 +53,17 @@
               HostContentSettingsMapFactory::GetForProfile(profile())
                   ->GetContentSetting(insecure_url.GetOrigin(),
                                       insecure_url.GetOrigin(),
-                                      permission_type,
-                                      std::string()));
+                                      content_settings_type, std::string()));
     EXPECT_EQ(CONTENT_SETTING_ASK,
               HostContentSettingsMapFactory::GetForProfile(profile())
                   ->GetContentSetting(secure_url.GetOrigin(),
                                       insecure_url.GetOrigin(),
-                                      permission_type,
-                                      std::string()));
+                                      content_settings_type, std::string()));
     EXPECT_EQ(CONTENT_SETTING_ASK,
               HostContentSettingsMapFactory::GetForProfile(profile())
                   ->GetContentSetting(insecure_url.GetOrigin(),
                                       secure_url.GetOrigin(),
-                                      permission_type,
-                                      std::string()));
+                                      content_settings_type, std::string()));
 
     EXPECT_EQ(CONTENT_SETTING_ASK,
               permission_context.GetPermissionStatus(insecure_url, insecure_url)
@@ -83,8 +74,8 @@
                   .content_setting);
   }
 
-  void TestSecureQueryingUrl(ContentSettingsType permission_type) {
-    TestPermissionContext permission_context(profile(), permission_type);
+  void TestSecureQueryingUrl(ContentSettingsType content_settings_type) {
+    TestPermissionContext permission_context(profile(), content_settings_type);
     GURL secure_url("https://www.example.com");
 
     // Check that there is no saved content settings.
@@ -92,7 +83,7 @@
               HostContentSettingsMapFactory::GetForProfile(profile())
                   ->GetContentSetting(secure_url.GetOrigin(),
                                       secure_url.GetOrigin(),
-                                      permission_type,
+                                      content_settings_type,
                                       std::string()));
 
     EXPECT_EQ(CONTENT_SETTING_ASK,
diff --git a/chrome/browser/media/webrtc/media_stream_devices_controller.cc b/chrome/browser/media/webrtc/media_stream_devices_controller.cc
index 9a229456..ba1a834 100644
--- a/chrome/browser/media/webrtc/media_stream_devices_controller.cc
+++ b/chrome/browser/media/webrtc/media_stream_devices_controller.cc
@@ -58,34 +58,34 @@
 
 // Returns true if the given ContentSettingsType is being requested in
 // |request|.
-bool ContentTypeIsRequested(content::PermissionType type,
+bool ContentTypeIsRequested(ContentSettingsType type,
                             const content::MediaStreamRequest& request) {
   if (request.request_type == content::MEDIA_OPEN_DEVICE_PEPPER_ONLY)
     return true;
 
-  if (type == content::PermissionType::AUDIO_CAPTURE)
+  if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)
     return request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE;
 
-  if (type == content::PermissionType::VIDEO_CAPTURE)
+  if (type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)
     return request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE;
 
   return false;
 }
 
 using PermissionActionCallback =
-    base::Callback<void(content::PermissionType,
+    base::Callback<void(ContentSettingsType,
                         PermissionRequestGestureType,
                         const GURL&,
                         Profile*)>;
 
 void RecordSinglePermissionAction(const content::MediaStreamRequest& request,
-                                  content::PermissionType permission_type,
+                                  ContentSettingsType content_type,
                                   Profile* profile,
                                   PermissionActionCallback callback) {
-  if (ContentTypeIsRequested(permission_type, request)) {
+  if (ContentTypeIsRequested(content_type, request)) {
     // TODO(stefanocs): Pass the actual |gesture_type| once this file has been
     // refactored into PermissionContext.
-    callback.Run(permission_type, PermissionRequestGestureType::UNKNOWN,
+    callback.Run(content_type, PermissionRequestGestureType::UNKNOWN,
                  request.security_origin, profile);
   }
 }
@@ -94,10 +94,10 @@
 void RecordPermissionAction(const content::MediaStreamRequest& request,
                             Profile* profile,
                             PermissionActionCallback callback) {
-  RecordSinglePermissionAction(request, content::PermissionType::AUDIO_CAPTURE,
+  RecordSinglePermissionAction(request, CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
                                profile, callback);
-  RecordSinglePermissionAction(request, content::PermissionType::VIDEO_CAPTURE,
-                               profile, callback);
+  RecordSinglePermissionAction(
+      request, CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, profile, callback);
 }
 
 // This helper class helps to measure the number of media stream requests that
@@ -256,16 +256,6 @@
           GetOrigin(), url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
 }
 
-content::PermissionType
-MediaStreamDevicesController::GetPermissionTypeForContentSettingsType(
-    ContentSettingsType content_type) const {
-  DCHECK(content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC ||
-         content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
-  content::PermissionType permission = content::PermissionType::NUM;
-  CHECK(PermissionUtil::GetPermissionType(content_type, &permission));
-  return permission;
-}
-
 void MediaStreamDevicesController::ForcePermissionDeniedTemporarily() {
   set_persist(false);
   // TODO(tsergeant): Determine whether it is appropriate to record permission
@@ -567,9 +557,7 @@
     return CONTENT_SETTING_BLOCK;
   }
 
-  content::PermissionType permission_type =
-      GetPermissionTypeForContentSettingsType(content_type);
-  if (ContentTypeIsRequested(permission_type, request)) {
+  if (ContentTypeIsRequested(content_type, request)) {
     DCHECK(content::IsOriginSecure(request_.security_origin) ||
            request_.request_type == content::MEDIA_OPEN_DEVICE_PEPPER_ONLY);
     MediaPermission permission(content_type, request.security_origin,
diff --git a/chrome/browser/media/webrtc/media_stream_devices_controller.h b/chrome/browser/media/webrtc/media_stream_devices_controller.h
index 45170221..8f005031 100644
--- a/chrome/browser/media/webrtc/media_stream_devices_controller.h
+++ b/chrome/browser/media/webrtc/media_stream_devices_controller.h
@@ -11,7 +11,6 @@
 #include "base/macros.h"
 #include "chrome/browser/permissions/permission_request.h"
 #include "components/content_settings/core/common/content_settings.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/web_contents_delegate.h"
 
 class Profile;
@@ -42,11 +41,6 @@
   bool IsAskingForVideo() const;
   base::string16 GetMessageText() const;
 
-  // Returns the PermissionsType associated with the provided
-  // ContentSettingsType. |content_type| must be a media stream type.
-  content::PermissionType GetPermissionTypeForContentSettingsType(
-      ContentSettingsType content_type) const;
-
   // Forces the permissions to be denied (without being persisted) regardless
   // of what the previous state was.  If the user had previously allowed the
   // site video or audio access, this ignores that and informs the site it was
diff --git a/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc b/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc
index cc56614..4e21927b 100644
--- a/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc
+++ b/chrome/browser/media/webrtc/media_stream_devices_controller_browsertest.cc
@@ -709,10 +709,10 @@
                        RequestAndKillSwitchMicCam) {
   std::map<std::string, std::string> params;
   params[PermissionUtil::GetPermissionString(
-      content::PermissionType::AUDIO_CAPTURE)] =
+      CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)] =
       PermissionContextBase::kPermissionsKillSwitchBlockedValue;
   params[PermissionUtil::GetPermissionString(
-      content::PermissionType::VIDEO_CAPTURE)] =
+      CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)] =
       PermissionContextBase::kPermissionsKillSwitchBlockedValue;
   variations::AssociateVariationParams(
       PermissionContextBase::kPermissionsKillSwitchFieldStudy,
diff --git a/chrome/browser/media/webrtc/media_stream_infobar_delegate_android.cc b/chrome/browser/media/webrtc/media_stream_infobar_delegate_android.cc
index 8ea9dc74..075e247b 100644
--- a/chrome/browser/media/webrtc/media_stream_infobar_delegate_android.cc
+++ b/chrome/browser/media/webrtc/media_stream_infobar_delegate_android.cc
@@ -88,7 +88,6 @@
           // refactoring.
           // TODO(lshang): Merge MediaStreamInfoBarDelegateAndroid into
           // GroupedPermissionInfoBarDelegate. See crbug.com/606138.
-          content::PermissionType::AUDIO_CAPTURE,
           CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
           user_gesture,
           profile,
@@ -152,11 +151,11 @@
 
     if (controller_->IsAskingForAudio()) {
       PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle(
-          content::PermissionType::AUDIO_CAPTURE, persist_permission);
+          CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, persist_permission);
     }
     if (controller_->IsAskingForVideo()) {
       PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle(
-          content::PermissionType::VIDEO_CAPTURE, persist_permission);
+          CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, persist_permission);
     }
   }
 
@@ -178,11 +177,11 @@
 
     if (controller_->IsAskingForAudio()) {
       PermissionUmaUtil::PermissionPromptDeniedWithPersistenceToggle(
-          content::PermissionType::AUDIO_CAPTURE, persist_permission);
+          CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, persist_permission);
     }
     if (controller_->IsAskingForVideo()) {
       PermissionUmaUtil::PermissionPromptDeniedWithPersistenceToggle(
-          content::PermissionType::VIDEO_CAPTURE, persist_permission);
+          CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, persist_permission);
     }
   }
   controller_->set_persist(persist_permission);
diff --git a/chrome/browser/notifications/message_center_settings_controller_unittest.cc b/chrome/browser/notifications/message_center_settings_controller_unittest.cc
index d33945a..5f663a0 100644
--- a/chrome/browser/notifications/message_center_settings_controller_unittest.cc
+++ b/chrome/browser/notifications/message_center_settings_controller_unittest.cc
@@ -18,7 +18,7 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
-#include "content/public/browser/permission_type.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_builder.h"
@@ -317,13 +317,13 @@
   controller()->SetNotifierEnabled(disabled_notifier, true);
   EXPECT_EQ(blink::mojom::PermissionStatus::GRANTED,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, origin, origin));
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, origin, origin));
 
   // (2) Disable the permission when the default is to ask (expected to clear).
   controller()->SetNotifierEnabled(enabled_notifier, false);
   EXPECT_EQ(blink::mojom::PermissionStatus::ASK,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, origin, origin));
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, origin, origin));
 
   // Change the default content setting vaule for notifications to ALLOW.
   HostContentSettingsMapFactory::GetForProfile(profile)
@@ -334,13 +334,13 @@
   controller()->SetNotifierEnabled(enabled_notifier, false);
   EXPECT_EQ(blink::mojom::PermissionStatus::DENIED,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, origin, origin));
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, origin, origin));
 
   // (4) Enable the permission when the default is allowed (expected to clear).
   controller()->SetNotifierEnabled(disabled_notifier, true);
   EXPECT_EQ(blink::mojom::PermissionStatus::GRANTED,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, origin, origin));
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, origin, origin));
 
   // Now change the default content setting value to BLOCK.
   HostContentSettingsMapFactory::GetForProfile(profile)
@@ -351,11 +351,11 @@
   controller()->SetNotifierEnabled(disabled_notifier, true);
   EXPECT_EQ(blink::mojom::PermissionStatus::GRANTED,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, origin, origin));
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, origin, origin));
 
   // (6) Disable the permission when the default is blocked (expected to clear).
   controller()->SetNotifierEnabled(enabled_notifier, false);
   EXPECT_EQ(blink::mojom::PermissionStatus::DENIED,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, origin, origin));
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, origin, origin));
 }
diff --git a/chrome/browser/notifications/notification_permission_context.cc b/chrome/browser/notifications/notification_permission_context.cc
index 88a0263..656c1b31 100644
--- a/chrome/browser/notifications/notification_permission_context.cc
+++ b/chrome/browser/notifications/notification_permission_context.cc
@@ -17,8 +17,8 @@
 #include "chrome/browser/permissions/permission_request_id.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
@@ -161,13 +161,11 @@
 
 NotificationPermissionContext::NotificationPermissionContext(
     Profile* profile,
-    content::PermissionType permission_type)
-    : PermissionContextBase(profile,
-                            permission_type,
-                            CONTENT_SETTINGS_TYPE_NOTIFICATIONS),
+    ContentSettingsType content_settings_type)
+    : PermissionContextBase(profile, content_settings_type),
       weak_factory_ui_thread_(this) {
-  DCHECK(permission_type == content::PermissionType::NOTIFICATIONS ||
-         permission_type == content::PermissionType::PUSH_MESSAGING);
+  DCHECK(content_settings_type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS ||
+         content_settings_type == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING);
 }
 
 NotificationPermissionContext::~NotificationPermissionContext() {}
@@ -176,8 +174,8 @@
     const GURL& requesting_origin,
     const GURL& embedding_origin) const {
   // Push messaging is only allowed to be granted on top-level origins.
-  if (permission_type() == content::PermissionType::PUSH_MESSAGING &&
-      requesting_origin != embedding_origin) {
+  if (content_settings_type() == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING
+          && requesting_origin != embedding_origin) {
     return CONTENT_SETTING_BLOCK;
   }
 
@@ -259,5 +257,5 @@
 }
 
 bool NotificationPermissionContext::IsRestrictedToSecureOrigins() const {
-  return permission_type() == content::PermissionType::PUSH_MESSAGING;
+  return content_settings_type() == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING;
 }
diff --git a/chrome/browser/notifications/notification_permission_context.h b/chrome/browser/notifications/notification_permission_context.h
index c9ab989..ea9f736 100644
--- a/chrome/browser/notifications/notification_permission_context.h
+++ b/chrome/browser/notifications/notification_permission_context.h
@@ -14,8 +14,7 @@
 
 class NotificationPermissionContext : public PermissionContextBase {
  public:
-  NotificationPermissionContext(Profile* profile,
-                                content::PermissionType permission_type);
+  NotificationPermissionContext(Profile* profile, ContentSettingsType);
   ~NotificationPermissionContext() override;
 
   // PermissionContextBase implementation.
diff --git a/chrome/browser/notifications/notification_permission_context_unittest.cc b/chrome/browser/notifications/notification_permission_context_unittest.cc
index b16aa9e..3c7f38b 100644
--- a/chrome/browser/notifications/notification_permission_context_unittest.cc
+++ b/chrome/browser/notifications/notification_permission_context_unittest.cc
@@ -28,13 +28,13 @@
 namespace {
 
 void DoNothing(ContentSetting content_setting) {}
-void DoNothing2(blink::mojom::PermissionStatus status) {}
+void DoNothing2(blink::mojom::PermissionStatus content_setting) {}
 
 class TestNotificationPermissionContext : public NotificationPermissionContext {
  public:
   explicit TestNotificationPermissionContext(Profile* profile)
       : NotificationPermissionContext(profile,
-                                      content::PermissionType::NOTIFICATIONS),
+                                      CONTENT_SETTINGS_TYPE_NOTIFICATIONS),
         permission_set_count_(0),
         last_permission_set_persisted_(false),
         last_permission_set_setting_(CONTENT_SETTING_DEFAULT) {}
@@ -113,7 +113,7 @@
   GURL different_origin("https://foobar.com");
 
   NotificationPermissionContext context(profile(),
-                                        content::PermissionType::NOTIFICATIONS);
+                                        CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
   UpdateContentSetting(&context, requesting_origin, embedding_origin,
                        CONTENT_SETTING_ALLOW);
 
@@ -142,8 +142,8 @@
   GURL requesting_origin("https://example.com");
   GURL embedding_origin("https://chrome.com");
 
-  NotificationPermissionContext context(
-      profile(), content::PermissionType::PUSH_MESSAGING);
+  NotificationPermissionContext context(profile(),
+                                        CONTENT_SETTINGS_TYPE_PUSH_MESSAGING);
   UpdateContentSetting(&context, requesting_origin, embedding_origin,
                        CONTENT_SETTING_ALLOW);
 
@@ -173,7 +173,7 @@
   GURL origin("http://example.com");
 
   NotificationPermissionContext context(profile(),
-                                        content::PermissionType::NOTIFICATIONS);
+                                        CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
   EXPECT_EQ(CONTENT_SETTING_ASK,
             context.GetPermissionStatus(origin, origin).content_setting);
 
@@ -189,7 +189,7 @@
   GURL secure_origin("https://example.com");
 
   NotificationPermissionContext context(
-      profile(), content::PermissionType::PUSH_MESSAGING);
+      profile(), CONTENT_SETTINGS_TYPE_PUSH_MESSAGING);
   EXPECT_EQ(CONTENT_SETTING_BLOCK,
             context.GetPermissionStatus(origin, origin).content_setting);
 
@@ -289,7 +289,7 @@
 
   base::TestMockTimeTaskRunner* task_runner = SwitchToMockTime();
 
-  content::PermissionManager* permission_manager =
+  PermissionManager* permission_manager =
       PermissionManagerFactory::GetForProfile(
           profile()->GetOffTheRecordProfile());
 
@@ -297,7 +297,7 @@
   // https://crbug.com/586944 regresses, then as well as the EXPECT_EQs below
   // failing, PermissionManager::OnPermissionsRequestResponseStatus will crash.
   int request_id = permission_manager->RequestPermission(
-      content::PermissionType::NOTIFICATIONS, web_contents()->GetMainFrame(),
+      CONTENT_SETTINGS_TYPE_NOTIFICATIONS, web_contents()->GetMainFrame(),
       url.GetOrigin(), true /* user_gesture */, base::Bind(&DoNothing2));
 
   permission_manager->CancelPermissionRequest(request_id);
diff --git a/chrome/browser/notifications/notification_permission_infobar_delegate.cc b/chrome/browser/notifications/notification_permission_infobar_delegate.cc
index 13925992..c41486e 100644
--- a/chrome/browser/notifications/notification_permission_infobar_delegate.cc
+++ b/chrome/browser/notifications/notification_permission_infobar_delegate.cc
@@ -8,19 +8,18 @@
 #include "chrome/grit/generated_resources.h"
 
 NotificationPermissionInfoBarDelegate::NotificationPermissionInfoBarDelegate(
-    const content::PermissionType& permission_type,
+    ContentSettingsType type,
     const GURL& requesting_frame,
     bool user_gesture,
     Profile* profile,
     const PermissionSetCallback& callback)
     : PermissionInfoBarDelegate(requesting_frame,
-                                permission_type,
-                                CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+                                type,
                                 user_gesture,
                                 profile,
                                 callback) {
-  DCHECK(permission_type == content::PermissionType::NOTIFICATIONS ||
-         permission_type == content::PermissionType::PUSH_MESSAGING);
+  DCHECK(type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS ||
+         type == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING);
 }
 
 NotificationPermissionInfoBarDelegate::~NotificationPermissionInfoBarDelegate()
diff --git a/chrome/browser/notifications/notification_permission_infobar_delegate.h b/chrome/browser/notifications/notification_permission_infobar_delegate.h
index b9e4931..6765722 100644
--- a/chrome/browser/notifications/notification_permission_infobar_delegate.h
+++ b/chrome/browser/notifications/notification_permission_infobar_delegate.h
@@ -10,14 +10,10 @@
 #include "base/macros.h"
 #include "chrome/browser/permissions/permission_infobar_delegate.h"
 
-namespace content {
-enum class PermissionType;
-}
-
 class NotificationPermissionInfoBarDelegate : public PermissionInfoBarDelegate {
  public:
   NotificationPermissionInfoBarDelegate(
-      const content::PermissionType& permission_type,
+      ContentSettingsType type,
       const GURL& requesting_frame,
       bool user_gesture,
       Profile* profile,
diff --git a/chrome/browser/notifications/notifier_state_tracker.cc b/chrome/browser/notifications/notifier_state_tracker.cc
index 9e3180d1..2f0ecc5 100644
--- a/chrome/browser/notifications/notifier_state_tracker.cc
+++ b/chrome/browser/notifications/notifier_state_tracker.cc
@@ -14,9 +14,9 @@
 #include "chrome/browser/permissions/permission_manager.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/pref_registry/pref_registry_syncable.h"
 #include "components/prefs/scoped_user_pref_update.h"
-#include "content/public/browser/permission_type.h"
 #include "extensions/features/features.h"
 #include "ui/message_center/notifier_settings.h"
 
@@ -87,7 +87,7 @@
           disabled_extension_ids_.end();
     case NotifierId::WEB_PAGE:
       return PermissionManager::Get(profile_)->GetPermissionStatus(
-                 content::PermissionType::NOTIFICATIONS, notifier_id.url,
+                 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, notifier_id.url,
                  notifier_id.url) == blink::mojom::PermissionStatus::GRANTED;
     case NotifierId::SYSTEM_COMPONENT:
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/notifications/platform_notification_service_impl.cc b/chrome/browser/notifications/platform_notification_service_impl.cc
index a03b72c..10c6a546 100644
--- a/chrome/browser/notifications/platform_notification_service_impl.cc
+++ b/chrome/browser/notifications/platform_notification_service_impl.cc
@@ -33,7 +33,6 @@
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/desktop_notification_delegate.h"
 #include "content/public/browser/notification_event_dispatcher.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/user_metrics.h"
 #include "content/public/common/notification_resources.h"
 #include "content/public/common/platform_notification_data.h"
@@ -229,7 +228,7 @@
 #endif
 
   return PermissionManager::Get(profile)->GetPermissionStatus(
-      content::PermissionType::NOTIFICATIONS, origin, origin);
+      CONTENT_SETTINGS_TYPE_NOTIFICATIONS, origin, origin);
 }
 
 blink::mojom::PermissionStatus
diff --git a/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc b/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
index 88f3984..f99ba22 100644
--- a/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
+++ b/chrome/browser/notifications/platform_notification_service_interactive_uitest.cc
@@ -31,7 +31,7 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/interactive_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "content/public/browser/permission_type.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
@@ -164,7 +164,7 @@
   DesktopNotificationProfileUtil::GrantPermission(browser()->profile(), origin);
   ASSERT_EQ(blink::mojom::PermissionStatus::GRANTED,
             PermissionManager::Get(browser()->profile())
-                ->GetPermissionStatus(content::PermissionType::NOTIFICATIONS,
+                ->GetPermissionStatus(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
                                       origin, origin));
 }
 
@@ -471,13 +471,13 @@
 
   EXPECT_EQ(blink::mojom::PermissionStatus::ASK,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, TestPageUrl(),
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, TestPageUrl(),
                 TestPageUrl()));
 
   RequestAndAcceptPermission();
   EXPECT_EQ(blink::mojom::PermissionStatus::GRANTED,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, TestPageUrl(),
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, TestPageUrl(),
                 TestPageUrl()));
 
   // This case should fail because a file URL is used.
@@ -491,12 +491,12 @@
 
   EXPECT_EQ(blink::mojom::PermissionStatus::ASK,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, file_url, file_url));
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, file_url, file_url));
 
   RequestAndAcceptPermission();
   EXPECT_EQ(blink::mojom::PermissionStatus::ASK,
             permission_manager->GetPermissionStatus(
-                content::PermissionType::NOTIFICATIONS, file_url, file_url))
+                CONTENT_SETTINGS_TYPE_NOTIFICATIONS, file_url, file_url))
       << "If this test fails, you may have fixed a bug preventing file origins "
       << "from sending their origin from Blink; if so you need to update the "
       << "display function for notification origins to show the file path.";
diff --git a/chrome/browser/permissions/delegation_tracker.cc b/chrome/browser/permissions/delegation_tracker.cc
index 759473b..9b1183d 100644
--- a/chrome/browser/permissions/delegation_tracker.cc
+++ b/chrome/browser/permissions/delegation_tracker.cc
@@ -9,7 +9,6 @@
 #include "base/memory/ptr_util.h"
 #include "chrome/browser/permissions/permission_util.h"
 #include "content/public/browser/navigation_handle.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -17,7 +16,7 @@
 class DelegationTracker::DelegatedForChild : content::WebContentsObserver {
  public:
   DelegatedForChild(content::RenderFrameHost* child_rfh,
-                    const std::vector<content::PermissionType>& permissions,
+                    const std::vector<ContentSettingsType>& permissions,
                     const base::Callback<void(content::RenderFrameHost*)>&
                         rfh_destroyed_callback)
       : content::WebContentsObserver(
@@ -28,7 +27,7 @@
 
   ~DelegatedForChild() override {}
 
-  bool HasPermission(const content::PermissionType& permission) {
+  bool HasPermission(ContentSettingsType permission) {
     return permissions_.count(permission) == 1;
   }
 
@@ -58,7 +57,7 @@
 
   content::RenderFrameHost* child_rfh_;
 
-  std::unordered_set<content::PermissionType, PermissionTypeHash> permissions_;
+  std::unordered_set<ContentSettingsType, ContentSettingsTypeHash> permissions_;
 
   base::Callback<void(content::RenderFrameHost*)> rfh_destroyed_callback_;
 };
@@ -69,7 +68,7 @@
 
 void DelegationTracker::SetDelegatedPermissions(
     content::RenderFrameHost* child_rfh,
-    const std::vector<content::PermissionType>& permissions) {
+    const std::vector<ContentSettingsType>& permissions) {
   DCHECK(child_rfh && child_rfh->GetParent());
   delegated_permissions_[child_rfh] = base::MakeUnique<DelegatedForChild>(
       child_rfh, permissions,
@@ -78,7 +77,7 @@
 }
 
 bool DelegationTracker::IsGranted(content::RenderFrameHost* requesting_rfh,
-                                  const content::PermissionType& permission) {
+                                  ContentSettingsType permission) {
   content::RenderFrameHost* child_rfh = requesting_rfh;
   while (child_rfh->GetParent()) {
     // Parents with unique origins can't delegate permission.
diff --git a/chrome/browser/permissions/delegation_tracker.h b/chrome/browser/permissions/delegation_tracker.h
index 0f3811d..68c1e79 100644
--- a/chrome/browser/permissions/delegation_tracker.h
+++ b/chrome/browser/permissions/delegation_tracker.h
@@ -10,11 +10,11 @@
 #include <vector>
 
 #include "base/macros.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 
 namespace content {
 
 class RenderFrameHost;
-enum class PermissionType;
 
 }  // namespace content
 
@@ -33,7 +33,7 @@
   // Set the |permissions| which are delegated to |child_rfh| by its parent.
   void SetDelegatedPermissions(
       content::RenderFrameHost* child_rfh,
-      const std::vector<content::PermissionType>& permissions);
+      const std::vector<ContentSettingsType>& permissions);
 
   // Query whether |permission| is granted to |requesting_rfh|. This will return
   // true if |requesting_rfh| is a top-level frame or if it has been delegated
@@ -42,7 +42,7 @@
   // |permission| to it's child OR have the same origin as it's child on that
   // path in order for this to return true.
   bool IsGranted(content::RenderFrameHost* requesting_rfh,
-                 const content::PermissionType& permission);
+                 ContentSettingsType permission);
 
  private:
   class DelegatedForChild;
diff --git a/chrome/browser/permissions/delegation_tracker_unittest.cc b/chrome/browser/permissions/delegation_tracker_unittest.cc
index 68cc4134..f00bb14 100644
--- a/chrome/browser/permissions/delegation_tracker_unittest.cc
+++ b/chrome/browser/permissions/delegation_tracker_unittest.cc
@@ -5,15 +5,12 @@
 #include "chrome/browser/permissions/delegation_tracker.h"
 
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/test_renderer_host.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
-using content::PermissionType;
-
 const char* kOrigin1 = "https://google.com";
 const char* kOrigin2 = "https://maps.google.com";
 const char* kOrigin3 = "https://example.com";
@@ -46,7 +43,7 @@
   DelegationTracker tracker;
   content::RenderFrameHost* parent = GetMainRFH(kOrigin1);
 
-  EXPECT_TRUE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 TEST_F(DelegationTrackerTest, SingleAncestorSameOrigin) {
@@ -54,8 +51,8 @@
   content::RenderFrameHost* parent = GetMainRFH(kOrigin1);
   content::RenderFrameHost* child = AddChildRFH(parent, kOrigin1);
 
-  EXPECT_TRUE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(child, PermissionType::GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 TEST_F(DelegationTrackerTest, SingleAncestorNoDelegation) {
@@ -63,8 +60,8 @@
   content::RenderFrameHost* parent = GetMainRFH(kOrigin1);
   content::RenderFrameHost* child = AddChildRFH(parent, kOrigin2);
 
-  EXPECT_TRUE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(child, PermissionType::GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 TEST_F(DelegationTrackerTest, SingleAncestorPermissionDelegated) {
@@ -72,11 +69,11 @@
   content::RenderFrameHost* parent = GetMainRFH(kOrigin1);
   content::RenderFrameHost* child = AddChildRFH(parent, kOrigin2);
 
-  tracker.SetDelegatedPermissions(child, {PermissionType::GEOLOCATION});
+  tracker.SetDelegatedPermissions(child, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
 
-  EXPECT_TRUE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(child, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(child, PermissionType::NOTIFICATIONS));
+  EXPECT_TRUE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 }
 
 TEST_F(DelegationTrackerTest, SingleAncestorMultiplePermissionsDelegated) {
@@ -84,11 +81,11 @@
   content::RenderFrameHost* parent = GetMainRFH(kOrigin1);
   content::RenderFrameHost* child = AddChildRFH(parent, kOrigin2);
 
-  tracker.SetDelegatedPermissions(
-      child, {PermissionType::GEOLOCATION, PermissionType::NOTIFICATIONS});
+  tracker.SetDelegatedPermissions(child, {CONTENT_SETTINGS_TYPE_GEOLOCATION,
+                                          CONTENT_SETTINGS_TYPE_NOTIFICATIONS});
 
-  EXPECT_TRUE(tracker.IsGranted(child, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(child, PermissionType::NOTIFICATIONS));
+  EXPECT_TRUE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 }
 
 TEST_F(DelegationTrackerTest, SingleAncestorMultipleChildren) {
@@ -97,10 +94,10 @@
   content::RenderFrameHost* child1 = AddChildRFH(parent, kOrigin2);
   content::RenderFrameHost* child2 = AddChildRFH(parent, kOrigin2);
 
-  tracker.SetDelegatedPermissions(child1, {PermissionType::GEOLOCATION});
+  tracker.SetDelegatedPermissions(child1, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
 
-  EXPECT_TRUE(tracker.IsGranted(child1, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(child2, PermissionType::GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(child1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(child2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 TEST_F(DelegationTrackerTest, MultipleAncestorsNotDelegated) {
@@ -110,11 +107,11 @@
   content::RenderFrameHost* child1 = AddChildRFH(parent, kOrigin3);
   content::RenderFrameHost* child2 = AddChildRFH(parent, kOrigin3);
 
-  tracker.SetDelegatedPermissions(child1, {PermissionType::GEOLOCATION});
+  tracker.SetDelegatedPermissions(child1, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
 
-  EXPECT_FALSE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(child1, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(child2, PermissionType::GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(child1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(child2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 TEST_F(DelegationTrackerTest, MultipleAncestorsDelegated) {
@@ -124,12 +121,12 @@
   content::RenderFrameHost* child1 = AddChildRFH(parent, kOrigin3);
   content::RenderFrameHost* child2 = AddChildRFH(parent, kOrigin3);
 
-  tracker.SetDelegatedPermissions(parent, {PermissionType::GEOLOCATION});
-  tracker.SetDelegatedPermissions(child1, {PermissionType::GEOLOCATION});
+  tracker.SetDelegatedPermissions(parent, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
+  tracker.SetDelegatedPermissions(child1, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
 
-  EXPECT_TRUE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(child1, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(child2, PermissionType::GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(child1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(child2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 TEST_F(DelegationTrackerTest, MultipleAncestorsSameOrigin) {
@@ -139,12 +136,12 @@
   content::RenderFrameHost* child1 = AddChildRFH(parent, kOrigin1);
   content::RenderFrameHost* child2 = AddChildRFH(parent, kOrigin1);
 
-  tracker.SetDelegatedPermissions(parent, {PermissionType::GEOLOCATION});
-  tracker.SetDelegatedPermissions(child1, {PermissionType::GEOLOCATION});
+  tracker.SetDelegatedPermissions(parent, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
+  tracker.SetDelegatedPermissions(child1, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
 
-  EXPECT_TRUE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(child1, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(child2, PermissionType::GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(child1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(child2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 TEST_F(DelegationTrackerTest, MultipleAncestorsComplexSinglePermission) {
@@ -156,13 +153,15 @@
   content::RenderFrameHost* parent2 = AddChildRFH(grandparent, kOrigin3);
   content::RenderFrameHost* child = AddChildRFH(parent1, kOrigin3);
 
-  tracker.SetDelegatedPermissions(grandparent, {PermissionType::GEOLOCATION});
-  tracker.SetDelegatedPermissions(child, {PermissionType::GEOLOCATION});
+  tracker.SetDelegatedPermissions(grandparent,
+                                  {CONTENT_SETTINGS_TYPE_GEOLOCATION});
+  tracker.SetDelegatedPermissions(child, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
 
-  EXPECT_TRUE(tracker.IsGranted(grandparent, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(parent1, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(parent2, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(child, PermissionType::GEOLOCATION));
+  EXPECT_TRUE(
+      tracker.IsGranted(grandparent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(parent1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(parent2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 TEST_F(DelegationTrackerTest, MultipleAncestorsComplexMultiplePermissions) {
@@ -174,21 +173,24 @@
   content::RenderFrameHost* parent2 = AddChildRFH(grandparent, kOrigin3);
   content::RenderFrameHost* child = AddChildRFH(parent1, kOrigin3);
 
-  tracker.SetDelegatedPermissions(grandparent, {PermissionType::GEOLOCATION,
-                                                PermissionType::NOTIFICATIONS});
-  tracker.SetDelegatedPermissions(child, {PermissionType::GEOLOCATION});
+  tracker.SetDelegatedPermissions(
+      grandparent,
+      {CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTINGS_TYPE_NOTIFICATIONS});
+  tracker.SetDelegatedPermissions(child, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
 
-  EXPECT_TRUE(tracker.IsGranted(grandparent, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(grandparent, PermissionType::NOTIFICATIONS));
+  EXPECT_TRUE(
+      tracker.IsGranted(grandparent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(
+      tracker.IsGranted(grandparent, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 
-  EXPECT_TRUE(tracker.IsGranted(parent1, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(parent1, PermissionType::NOTIFICATIONS));
+  EXPECT_TRUE(tracker.IsGranted(parent1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(parent1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 
-  EXPECT_FALSE(tracker.IsGranted(parent2, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(parent2, PermissionType::NOTIFICATIONS));
+  EXPECT_FALSE(tracker.IsGranted(parent2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(parent2, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 
-  EXPECT_TRUE(tracker.IsGranted(child, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(child, PermissionType::NOTIFICATIONS));
+  EXPECT_TRUE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 }
 
 TEST_F(DelegationTrackerTest, RenderFrameHostChanged) {
@@ -197,17 +199,17 @@
   content::RenderFrameHost* parent = AddChildRFH(grandparent, kOrigin2);
   content::RenderFrameHost* child = AddChildRFH(parent, kOrigin3);
 
-  tracker.SetDelegatedPermissions(parent, {PermissionType::GEOLOCATION});
-  tracker.SetDelegatedPermissions(child, {PermissionType::GEOLOCATION});
+  tracker.SetDelegatedPermissions(parent, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
+  tracker.SetDelegatedPermissions(child, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
 
-  EXPECT_TRUE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
-  EXPECT_TRUE(tracker.IsGranted(child, PermissionType::GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_TRUE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   content::RenderFrameHostTester::For(parent)->SimulateNavigationCommit(
       GURL(kUniqueOrigin));
 
-  EXPECT_FALSE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(child, PermissionType::GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 TEST_F(DelegationTrackerTest, UniqueOrigins) {
@@ -216,10 +218,10 @@
   content::RenderFrameHost* parent = AddChildRFH(grandparent, kOrigin2);
   content::RenderFrameHost* child = AddChildRFH(parent, kOrigin3);
 
-  tracker.SetDelegatedPermissions(parent, {PermissionType::GEOLOCATION});
-  tracker.SetDelegatedPermissions(child, {PermissionType::GEOLOCATION});
+  tracker.SetDelegatedPermissions(parent, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
+  tracker.SetDelegatedPermissions(child, {CONTENT_SETTINGS_TYPE_GEOLOCATION});
 
   // Unique origins should never be able to delegate permission.
-  EXPECT_FALSE(tracker.IsGranted(parent, PermissionType::GEOLOCATION));
-  EXPECT_FALSE(tracker.IsGranted(child, PermissionType::GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(parent, CONTENT_SETTINGS_TYPE_GEOLOCATION));
+  EXPECT_FALSE(tracker.IsGranted(child, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
diff --git a/chrome/browser/permissions/permission_blacklist_client.cc b/chrome/browser/permissions/permission_blacklist_client.cc
index 4262df65d..c57000b 100644
--- a/chrome/browser/permissions/permission_blacklist_client.cc
+++ b/chrome/browser/permissions/permission_blacklist_client.cc
@@ -20,27 +20,28 @@
 // static
 void PermissionBlacklistClient::CheckSafeBrowsingBlacklist(
     scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
-    content::PermissionType permission_type,
+    ContentSettingsType content_settings_type,
     const GURL& request_origin,
     content::WebContents* web_contents,
     int timeout,
     base::Callback<void(bool)> callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  new PermissionBlacklistClient(db_manager, permission_type, request_origin,
-                                web_contents, timeout, callback);
+  new PermissionBlacklistClient(db_manager, content_settings_type,
+                                request_origin, web_contents, timeout,
+                                callback);
 }
 
 PermissionBlacklistClient::PermissionBlacklistClient(
     scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
-    content::PermissionType permission_type,
+    ContentSettingsType content_settings_type,
     const GURL& request_origin,
     content::WebContents* web_contents,
     int timeout,
     base::Callback<void(bool)> callback)
     : content::WebContentsObserver(web_contents),
       db_manager_(db_manager),
-      permission_type_(permission_type),
+      content_settings_type_(content_settings_type),
       callback_(callback),
       timeout_(timeout),
       is_active_(true) {
@@ -89,8 +90,8 @@
   timer_.reset(nullptr);
   bool permission_blocked =
       metadata.api_permissions.find(
-          PermissionUtil::ConvertPermissionTypeToSafeBrowsingName(
-              permission_type_)) != metadata.api_permissions.end();
+          PermissionUtil::ConvertContentSettingsTypeToSafeBrowsingName(
+              content_settings_type_)) != metadata.api_permissions.end();
   if (permission_blocked)
     response = SafeBrowsingResponse::BLACKLISTED;
 
diff --git a/chrome/browser/permissions/permission_blacklist_client.h b/chrome/browser/permissions/permission_blacklist_client.h
index 1d3f080..87f7333 100644
--- a/chrome/browser/permissions/permission_blacklist_client.h
+++ b/chrome/browser/permissions/permission_blacklist_client.h
@@ -9,8 +9,8 @@
 
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/safe_browsing_db/database_manager.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/web_contents_observer.h"
 
 class GURL;
@@ -38,7 +38,7 @@
   // to be alive.
   static void CheckSafeBrowsingBlacklist(
       scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
-      content::PermissionType permission_type,
+      ContentSettingsType content_settings_type,
       const GURL& request_origin,
       content::WebContents* web_contents,
       int timeout,
@@ -49,7 +49,7 @@
 
   PermissionBlacklistClient(
       scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
-      content::PermissionType permission_type,
+      ContentSettingsType content_settings_type,
       const GURL& request_origin,
       content::WebContents* web_contents,
       int timeout,
@@ -72,7 +72,7 @@
   void WebContentsDestroyed() override;
 
   scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager_;
-  content::PermissionType permission_type_;
+  ContentSettingsType content_settings_type_;
 
   // PermissionContextBase callback to run on the UI thread.
   base::Callback<void(bool)> callback_;
diff --git a/chrome/browser/permissions/permission_context_base.cc b/chrome/browser/permissions/permission_context_base.cc
index 0d0bb87..4db37b31 100644
--- a/chrome/browser/permissions/permission_context_base.cc
+++ b/chrome/browser/permissions/permission_context_base.cc
@@ -29,7 +29,6 @@
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/pref_names.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
-#include "components/content_settings/core/browser/website_settings_registry.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "components/variations/variations_associated_data.h"
@@ -58,15 +57,13 @@
 
 PermissionContextBase::PermissionContextBase(
     Profile* profile,
-    const content::PermissionType permission_type,
     const ContentSettingsType content_settings_type)
     : profile_(profile),
-      permission_type_(permission_type),
       content_settings_type_(content_settings_type),
       weak_factory_(this) {
 #if defined(OS_ANDROID)
-  permission_queue_controller_.reset(new PermissionQueueController(
-      profile_, permission_type_, content_settings_type_));
+  permission_queue_controller_.reset(
+      new PermissionQueueController(profile_, content_settings_type_));
 #endif
   PermissionDecisionAutoBlocker::UpdateFromVariations();
 }
@@ -90,7 +87,8 @@
         content::CONSOLE_MESSAGE_LEVEL_INFO,
         base::StringPrintf(
             "%s permission has been blocked.",
-            PermissionUtil::GetPermissionString(permission_type_).c_str()));
+            PermissionUtil::GetPermissionString(content_settings_type_)
+                .c_str()));
     // The kill switch is enabled for this permission; Block all requests.
     callback.Run(CONTENT_SETTING_BLOCK);
     return;
@@ -101,9 +99,7 @@
 
   if (!requesting_origin.is_valid() || !embedding_origin.is_valid()) {
     std::string type_name =
-        content_settings::WebsiteSettingsRegistry::GetInstance()
-            ->Get(content_settings_type_)
-            ->name();
+        PermissionUtil::GetPermissionString(content_settings_type_);
 
     DVLOG(1) << "Attempt to use " << type_name
              << " from an invalid URL: " << requesting_origin << ","
@@ -121,7 +117,7 @@
       GetPermissionStatus(requesting_origin, embedding_origin);
   if (result.content_setting == CONTENT_SETTING_ALLOW) {
     HostContentSettingsMapFactory::GetForProfile(profile_)->UpdateLastUsage(
-        requesting_origin, embedding_origin, content_settings_type_);
+        requesting_origin, embedding_origin, content_settings_storage_type());
   }
 
   if (result.content_setting == CONTENT_SETTING_ALLOW ||
@@ -136,7 +132,7 @@
   // have been dismissed too many times in a row. If the origin is allowed to
   // request, that request will be made to ContinueRequestPermission().
   PermissionDecisionAutoBlocker::GetForProfile(profile_)->UpdateEmbargoedStatus(
-      permission_type_, requesting_origin, web_contents,
+      content_settings_type_, requesting_origin, web_contents,
       base::Bind(&PermissionContextBase::ContinueRequestPermission,
                  weak_factory_.GetWeakPtr(), web_contents, id,
                  requesting_origin, embedding_origin, user_gesture, callback));
@@ -156,7 +152,8 @@
         content::CONSOLE_MESSAGE_LEVEL_INFO,
         base::StringPrintf(
             "%s permission has been auto-blocked.",
-            PermissionUtil::GetPermissionString(permission_type_).c_str()));
+            PermissionUtil::GetPermissionString(content_settings_type_)
+                .c_str()));
     // Permission has been automatically blocked.
     PermissionUmaUtil::RecordPermissionEmbargoStatus(
         PermissionEmbargoStatus::PERMISSIONS_BLACKLISTING);
@@ -164,8 +161,8 @@
     return;
   }
 
-  PermissionUmaUtil::PermissionRequested(permission_type_, requesting_origin,
-                                         embedding_origin, profile_);
+  PermissionUmaUtil::PermissionRequested(
+      content_settings_type_, requesting_origin, embedding_origin, profile_);
 
   DecidePermission(web_contents, id, requesting_origin, embedding_origin,
                    user_gesture, callback);
@@ -193,7 +190,7 @@
       GetPermissionStatusInternal(requesting_origin, embedding_origin);
   if (content_setting == CONTENT_SETTING_ASK &&
       PermissionDecisionAutoBlocker::GetForProfile(profile_)->IsUnderEmbargo(
-          permission_type_, requesting_origin)) {
+          content_settings_type_, requesting_origin)) {
     return PermissionResult(CONTENT_SETTING_BLOCK,
                             PermissionStatusSource::UNSPECIFIED);
   }
@@ -206,8 +203,8 @@
     const GURL& embedding_origin) {
   HostContentSettingsMapFactory::GetForProfile(profile_)
       ->SetContentSettingDefaultScope(requesting_origin, embedding_origin,
-                                      content_settings_type_, std::string(),
-                                      CONTENT_SETTING_DEFAULT);
+                                      content_settings_storage_type(),
+                                      std::string(), CONTENT_SETTING_DEFAULT);
 }
 
 void PermissionContextBase::CancelPermissionRequest(
@@ -234,7 +231,7 @@
 bool PermissionContextBase::IsPermissionKillSwitchOn() const {
   const std::string param = variations::GetVariationParamValue(
       kPermissionsKillSwitchFieldStudy,
-      PermissionUtil::GetPermissionString(permission_type_));
+      PermissionUtil::GetPermissionString(content_settings_type_));
 
   return param == kPermissionsKillSwitchBlockedValue;
 }
@@ -244,7 +241,7 @@
     const GURL& embedding_origin) const {
   return HostContentSettingsMapFactory::GetForProfile(profile_)
       ->GetContentSetting(requesting_origin, embedding_origin,
-                          content_settings_type_, std::string());
+                          content_settings_storage_type(), std::string());
 }
 
 void PermissionContextBase::DecidePermission(
@@ -266,7 +263,7 @@
 
     std::unique_ptr<PermissionRequest> request_ptr =
         base::MakeUnique<PermissionRequestImpl>(
-            requesting_origin, permission_type_, profile_, user_gesture,
+            requesting_origin, content_settings_type_, profile_, user_gesture,
             base::Bind(&PermissionContextBase::PermissionDecided,
                        weak_factory_.GetWeakPtr(), id, requesting_origin,
                        embedding_origin, user_gesture, callback),
@@ -316,17 +313,18 @@
            content_setting == CONTENT_SETTING_BLOCK ||
            content_setting == CONTENT_SETTING_DEFAULT);
     if (content_setting == CONTENT_SETTING_ALLOW) {
-      PermissionUmaUtil::PermissionGranted(permission_type_, gesture_type,
+      PermissionUmaUtil::PermissionGranted(content_settings_type_, gesture_type,
                                            requesting_origin, profile_);
     } else if (content_setting == CONTENT_SETTING_BLOCK) {
-      PermissionUmaUtil::PermissionDenied(permission_type_, gesture_type,
+      PermissionUmaUtil::PermissionDenied(content_settings_type_, gesture_type,
                                           requesting_origin, profile_);
     } else {
-      PermissionUmaUtil::PermissionDismissed(permission_type_, gesture_type,
-                                             requesting_origin, profile_);
+      PermissionUmaUtil::PermissionDismissed(
+          content_settings_type_, gesture_type, requesting_origin, profile_);
 
       if (PermissionDecisionAutoBlocker::GetForProfile(profile_)
-              ->RecordDismissAndEmbargo(requesting_origin, permission_type_)) {
+              ->RecordDismissAndEmbargo(requesting_origin,
+                                        content_settings_type_)) {
         embargo_status = PermissionEmbargoStatus::REPEATED_DISMISSALS;
       }
     }
@@ -386,6 +384,13 @@
 
   HostContentSettingsMapFactory::GetForProfile(profile_)
       ->SetContentSettingDefaultScope(requesting_origin, embedding_origin,
-                                      content_settings_type_, std::string(),
-                                      content_setting);
+                                      content_settings_storage_type(),
+                                      std::string(), content_setting);
+}
+
+ContentSettingsType PermissionContextBase::content_settings_storage_type()
+    const {
+  if (content_settings_type_ == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING)
+    return CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
+  return content_settings_type_;
 }
diff --git a/chrome/browser/permissions/permission_context_base.h b/chrome/browser/permissions/permission_context_base.h
index 7ea2e08..1957a44 100644
--- a/chrome/browser/permissions/permission_context_base.h
+++ b/chrome/browser/permissions/permission_context_base.h
@@ -15,7 +15,6 @@
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_types.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "content/public/browser/permission_type.h"
 
 #if defined(OS_ANDROID)
 class PermissionQueueController;
@@ -83,7 +82,6 @@
 class PermissionContextBase : public KeyedService {
  public:
   PermissionContextBase(Profile* profile,
-                        const content::PermissionType permission_type,
                         const ContentSettingsType content_settings_type);
   ~PermissionContextBase() override;
 
@@ -181,11 +179,15 @@
   // Whether the permission should be restricted to secure origins.
   virtual bool IsRestrictedToSecureOrigins() const = 0;
 
-  content::PermissionType permission_type() const { return permission_type_; }
   ContentSettingsType content_settings_type() const {
     return content_settings_type_;
   }
 
+  // TODO(timloh): The CONTENT_SETTINGS_TYPE_NOTIFICATIONS type is used to
+  // store both push messaging and notifications permissions. Remove this
+  // once we've unified these types (crbug.com/563297).
+  ContentSettingsType content_settings_storage_type() const;
+
  private:
   friend class PermissionContextBaseTests;
 
@@ -204,7 +206,6 @@
                                  bool permission_blocked);
 
   Profile* profile_;
-  const content::PermissionType permission_type_;
   const ContentSettingsType content_settings_type_;
 #if defined(OS_ANDROID)
   std::unique_ptr<PermissionQueueController> permission_queue_controller_;
diff --git a/chrome/browser/permissions/permission_context_base_unittest.cc b/chrome/browser/permissions/permission_context_base_unittest.cc
index 5c6d814..9dd2f2a 100644
--- a/chrome/browser/permissions/permission_context_base_unittest.cc
+++ b/chrome/browser/permissions/permission_context_base_unittest.cc
@@ -38,7 +38,6 @@
 #include "components/safe_browsing_db/test_database_manager.h"
 #include "components/variations/variations_associated_data.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/mock_render_process_host.h"
@@ -104,9 +103,8 @@
 class TestPermissionContext : public PermissionContextBase {
  public:
   TestPermissionContext(Profile* profile,
-                        const content::PermissionType permission_type,
                         const ContentSettingsType content_settings_type)
-      : PermissionContextBase(profile, permission_type, content_settings_type),
+      : PermissionContextBase(profile, content_settings_type),
         tab_context_updated_(false) {}
 
   ~TestPermissionContext() override {}
@@ -137,7 +135,8 @@
                                           const GURL& url_b) {
     auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
     return map->GetContentSetting(url_a.GetOrigin(), url_b.GetOrigin(),
-                                  content_settings_type(), std::string());
+                                  content_settings_storage_type(),
+                                  std::string());
   }
 
   void RequestPermission(content::WebContents* web_contents,
@@ -204,9 +203,8 @@
  public:
   TestKillSwitchPermissionContext(
       Profile* profile,
-      const content::PermissionType permission_type,
       const ContentSettingsType content_settings_type)
-      : TestPermissionContext(profile, permission_type, content_settings_type),
+      : TestPermissionContext(profile, content_settings_type),
         field_trial_list_(base::MakeUnique<base::FieldTrialList>(
             base::MakeUnique<base::MockEntropyProvider>())) {}
 
@@ -267,12 +265,10 @@
 #endif
   }
 
-  void TestAskAndDecide_TestContent(content::PermissionType permission,
-                                    ContentSettingsType content_settings_type,
+  void TestAskAndDecide_TestContent(ContentSettingsType content_settings_type,
                                     ContentSetting decision,
                                     bool persist) {
-    TestPermissionContext permission_context(profile(), permission,
-                                             content_settings_type);
+    TestPermissionContext permission_context(profile(), content_settings_type);
     GURL url("https://www.google.com");
     NavigateAndCommit(url);
     base::HistogramTester histograms;
@@ -305,11 +301,11 @@
     if (decision_string.size()) {
       histograms.ExpectUniqueSample(
           "Permissions.Prompt." + decision_string + ".PriorDismissCount." +
-              PermissionUtil::GetPermissionString(permission),
+              PermissionUtil::GetPermissionString(content_settings_type),
           0, 1);
       histograms.ExpectUniqueSample(
           "Permissions.Prompt." + decision_string + ".PriorIgnoreCount." +
-              PermissionUtil::GetPermissionString(permission),
+              PermissionUtil::GetPermissionString(content_settings_type),
           0, 1);
     }
 
@@ -327,7 +323,6 @@
 
   void DismissMultipleTimesAndExpectBlock(
       const GURL& url,
-      content::PermissionType permission_type,
       ContentSettingsType content_settings_type,
       uint32_t iterations) {
     base::HistogramTester histograms;
@@ -337,8 +332,8 @@
     for (uint32_t i = 0; i < iterations; ++i) {
       ContentSetting expected =
           (i < 2) ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK;
-      TestPermissionContext permission_context(
-          profile(), permission_type, content_settings_type);
+      TestPermissionContext permission_context(profile(),
+                                               content_settings_type);
       const PermissionRequestID id(
           web_contents()->GetRenderProcessHost()->GetID(),
           web_contents()->GetMainFrame()->GetRoutingID(), i);
@@ -354,11 +349,11 @@
                     base::Unretained(&permission_context)));
       histograms.ExpectTotalCount(
           "Permissions.Prompt.Dismissed.PriorDismissCount." +
-              PermissionUtil::GetPermissionString(permission_type),
+              PermissionUtil::GetPermissionString(content_settings_type),
           i + 1);
       histograms.ExpectBucketCount(
           "Permissions.Prompt.Dismissed.PriorDismissCount." +
-              PermissionUtil::GetPermissionString(permission_type),
+              PermissionUtil::GetPermissionString(content_settings_type),
           i, 1);
       histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoStatus",
                                   i + 1);
@@ -381,8 +376,7 @@
       EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
     }
 
-    TestPermissionContext permission_context(profile(), permission_type,
-                                             content_settings_type);
+    TestPermissionContext permission_context(profile(), content_settings_type);
     const PermissionRequestID id(
         web_contents()->GetRenderProcessHost()->GetID(),
         web_contents()->GetMainFrame()->GetRoutingID(), -1);
@@ -410,8 +404,7 @@
     // First, ensure that > 3 dismissals behaves correctly.
     for (uint32_t i = 0; i < 4; ++i) {
       TestPermissionContext permission_context(
-          profile(), content::PermissionType::GEOLOCATION,
-          CONTENT_SETTINGS_TYPE_GEOLOCATION);
+          profile(), CONTENT_SETTINGS_TYPE_GEOLOCATION);
 
       const PermissionRequestID id(
           web_contents()->GetRenderProcessHost()->GetID(),
@@ -455,10 +448,8 @@
 
     // Sanity check independence per permission type by checking two of them.
     DismissMultipleTimesAndExpectBlock(url,
-                                       content::PermissionType::GEOLOCATION,
                                        CONTENT_SETTINGS_TYPE_GEOLOCATION, 3);
     DismissMultipleTimesAndExpectBlock(url,
-                                       content::PermissionType::NOTIFICATIONS,
                                        CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 3);
   }
 
@@ -498,8 +489,7 @@
 
     for (uint32_t i = 0; i < 5; ++i) {
       TestPermissionContext permission_context(
-          profile(), content::PermissionType::MIDI_SYSEX,
-          CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
+          profile(), CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
 
       ContentSetting expected =
           (i < 4) ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK;
@@ -542,9 +532,8 @@
     }
 
     // Ensure that we finish in the block state.
-    TestPermissionContext permission_context(
-        profile(), content::PermissionType::MIDI_SYSEX,
-        CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
+    TestPermissionContext permission_context(profile(),
+                                             CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
     PermissionResult result = permission_context.GetPermissionStatus(url, url);
     EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
     EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
@@ -553,10 +542,8 @@
   }
 
   void TestRequestPermissionInvalidUrl(
-      content::PermissionType permission_type,
       ContentSettingsType content_settings_type) {
-    TestPermissionContext permission_context(profile(), permission_type,
-                                             content_settings_type);
+    TestPermissionContext permission_context(profile(), content_settings_type);
     GURL url;
     ASSERT_FALSE(url.is_valid());
     NavigateAndCommit(url);
@@ -578,11 +565,9 @@
               permission_context.GetContentSettingFromMap(url, url));
   }
 
-  void TestGrantAndRevoke_TestContent(content::PermissionType permission_type,
-                                      ContentSettingsType content_settings_type,
+  void TestGrantAndRevoke_TestContent(ContentSettingsType content_settings_type,
                                       ContentSetting expected_default) {
-    TestPermissionContext permission_context(profile(), permission_type,
-                                             content_settings_type);
+    TestPermissionContext permission_context(profile(), content_settings_type);
     GURL url("https://www.google.com");
     NavigateAndCommit(url);
 
@@ -618,15 +603,14 @@
   }
 
   void TestGlobalPermissionsKillSwitch(
-      content::PermissionType permission_type,
       ContentSettingsType content_settings_type) {
-    TestKillSwitchPermissionContext permission_context(
-        profile(), permission_type, content_settings_type);
+    TestKillSwitchPermissionContext permission_context(profile(),
+                                                       content_settings_type);
     permission_context.ResetFieldTrialList();
 
     EXPECT_FALSE(permission_context.IsPermissionKillSwitchOn());
     std::map<std::string, std::string> params;
-    params[PermissionUtil::GetPermissionString(permission_type)] =
+    params[PermissionUtil::GetPermissionString(content_settings_type)] =
         kPermissionsKillSwitchBlockedValue;
     variations::AssociateVariationParams(
         kPermissionsKillSwitchFieldStudy, kPermissionsKillSwitchTestGroup,
@@ -640,8 +624,7 @@
   // HostContentSettingsMap.
   void TestParallelRequests(ContentSetting response) {
     TestPermissionContext permission_context(
-        profile(), content::PermissionType::NOTIFICATIONS,
-        CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+        profile(), CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
     GURL url("http://www.google.com");
     NavigateAndCommit(url);
 
@@ -682,7 +665,6 @@
   }
 
   void TestPermissionsBlacklisting(
-      content::PermissionType permission_type,
       ContentSettingsType content_settings_type,
       scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
       const GURL& url,
@@ -693,8 +675,7 @@
     base::HistogramTester histograms;
     base::test::ScopedFeatureList scoped_feature_list;
     scoped_feature_list.InitAndEnableFeature(features::kPermissionsBlacklist);
-    TestPermissionContext permission_context(profile(), permission_type,
-                                             content_settings_type);
+    TestPermissionContext permission_context(profile(), content_settings_type);
     PermissionDecisionAutoBlocker::GetForProfile(profile())
         ->SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
                                                              timeout);
@@ -745,39 +726,34 @@
 // Simulates clicking Accept. The permission should be granted and
 // saved for future use.
 TEST_F(PermissionContextBaseTests, TestAskAndGrantPersist) {
-  TestAskAndDecide_TestContent(content::PermissionType::NOTIFICATIONS,
-                               CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+  TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
                                CONTENT_SETTING_ALLOW, true);
 }
 
 // Simulates clicking Accept. The permission should be granted, but not
 // persisted.
 TEST_F(PermissionContextBaseTests, TestAskAndGrantNoPersist) {
-  TestAskAndDecide_TestContent(content::PermissionType::NOTIFICATIONS,
-                               CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+  TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
                                CONTENT_SETTING_ALLOW, false);
 }
 
 // Simulates clicking Block. The permission should be denied and
 // saved for future use.
 TEST_F(PermissionContextBaseTests, TestAskAndBlockPersist) {
-  TestAskAndDecide_TestContent(content::PermissionType::GEOLOCATION,
-                               CONTENT_SETTINGS_TYPE_GEOLOCATION,
+  TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_GEOLOCATION,
                                CONTENT_SETTING_BLOCK, true);
 }
 
 // Simulates clicking Block. The permission should be denied, but not persisted.
 TEST_F(PermissionContextBaseTests, TestAskAndBlockNoPersist) {
-  TestAskAndDecide_TestContent(content::PermissionType::GEOLOCATION,
-                               CONTENT_SETTINGS_TYPE_GEOLOCATION,
+  TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_GEOLOCATION,
                                CONTENT_SETTING_BLOCK, false);
 }
 
 // Simulates clicking Dismiss (X) in the infobar/bubble.
 // The permission should be denied but not saved for future use.
 TEST_F(PermissionContextBaseTests, TestAskAndDismiss) {
-  TestAskAndDecide_TestContent(content::PermissionType::MIDI_SYSEX,
-                               CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
+  TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
                                CONTENT_SETTING_ASK, false);
 }
 
@@ -796,17 +772,12 @@
 // Simulates non-valid requesting URL.
 // The permission should be denied but not saved for future use.
 TEST_F(PermissionContextBaseTests, TestNonValidRequestingUrl) {
-  TestRequestPermissionInvalidUrl(content::PermissionType::GEOLOCATION,
-                                  CONTENT_SETTINGS_TYPE_GEOLOCATION);
-  TestRequestPermissionInvalidUrl(content::PermissionType::NOTIFICATIONS,
-                                  CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
-  TestRequestPermissionInvalidUrl(content::PermissionType::MIDI_SYSEX,
-                                  CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
-  TestRequestPermissionInvalidUrl(content::PermissionType::PUSH_MESSAGING,
-                                  CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+  TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_GEOLOCATION);
+  TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+  TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
+  TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_PUSH_MESSAGING);
 #if defined(OS_ANDROID) || defined(OS_CHROMEOS)
   TestRequestPermissionInvalidUrl(
-      content::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
       CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
 #endif
 }
@@ -814,14 +785,11 @@
 #if defined(OS_ANDROID)
 // This test is specific to Android because other platforms use bubbles.
 TEST_F(PermissionContextBaseTests, TestGrantAndRevokeWithInfobars) {
-  TestGrantAndRevoke_TestContent(content::PermissionType::GEOLOCATION,
-                                 CONTENT_SETTINGS_TYPE_GEOLOCATION,
+  TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_GEOLOCATION,
                                  CONTENT_SETTING_ASK);
-  TestGrantAndRevoke_TestContent(content::PermissionType::MIDI_SYSEX,
-                                 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
+  TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
                                  CONTENT_SETTING_ASK);
   TestGrantAndRevoke_TestContent(
-      content::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
       CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, CONTENT_SETTING_ASK);
   // TODO(timvolodine): currently no test for
   // CONTENT_SETTINGS_TYPE_NOTIFICATIONS because notification permissions work
@@ -833,42 +801,28 @@
 // Simulates granting and revoking of permissions using permission bubbles.
 // This test shouldn't run on mobile because mobile platforms use infobars.
 TEST_F(PermissionContextBaseTests, TestGrantAndRevokeWithBubbles) {
-  TestGrantAndRevoke_TestContent(content::PermissionType::GEOLOCATION,
-                                 CONTENT_SETTINGS_TYPE_GEOLOCATION,
+  TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_GEOLOCATION,
                                  CONTENT_SETTING_ASK);
-  TestGrantAndRevoke_TestContent(content::PermissionType::NOTIFICATIONS,
-                                 CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+  TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
                                  CONTENT_SETTING_ASK);
-  TestGrantAndRevoke_TestContent(content::PermissionType::MIDI_SYSEX,
-                                 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
-                                 CONTENT_SETTING_ASK);
-  TestGrantAndRevoke_TestContent(content::PermissionType::PUSH_MESSAGING,
-                                 CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
+  TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
                                  CONTENT_SETTING_ASK);
 }
 #endif
 
 // Tests the global kill switch by enabling/disabling the Field Trials.
 TEST_F(PermissionContextBaseTests, TestGlobalKillSwitch) {
-  TestGlobalPermissionsKillSwitch(content::PermissionType::GEOLOCATION,
-                                  CONTENT_SETTINGS_TYPE_GEOLOCATION);
-  TestGlobalPermissionsKillSwitch(content::PermissionType::NOTIFICATIONS,
-                                  CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
-  TestGlobalPermissionsKillSwitch(content::PermissionType::MIDI_SYSEX,
-                                  CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
-  TestGlobalPermissionsKillSwitch(content::PermissionType::PUSH_MESSAGING,
-                                  CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
-  TestGlobalPermissionsKillSwitch(content::PermissionType::DURABLE_STORAGE,
-                                  CONTENT_SETTINGS_TYPE_DURABLE_STORAGE);
+  TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_GEOLOCATION);
+  TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+  TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
+  TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_PUSH_MESSAGING);
+  TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_DURABLE_STORAGE);
 #if defined(OS_ANDROID) || defined(OS_CHROMEOS)
   TestGlobalPermissionsKillSwitch(
-      content::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
       CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
 #endif
-  TestGlobalPermissionsKillSwitch(content::PermissionType::AUDIO_CAPTURE,
-                                  CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
-  TestGlobalPermissionsKillSwitch(content::PermissionType::VIDEO_CAPTURE,
-                                  CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
+  TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
+  TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
 }
 
 TEST_F(PermissionContextBaseTests, TestParallelRequestsAllowed) {
@@ -892,7 +846,7 @@
   std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
   db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
   TestPermissionsBlacklisting(
-      content::PermissionType::GEOLOCATION, CONTENT_SETTINGS_TYPE_GEOLOCATION,
+      CONTENT_SETTINGS_TYPE_GEOLOCATION,
       db_manager, url, 2000 /* timeout */, CONTENT_SETTING_BLOCK,
       PermissionEmbargoStatus::PERMISSIONS_BLACKLISTING);
 }
@@ -905,8 +859,7 @@
   const GURL url("https://www.example.com");
   std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
   db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
-  TestPermissionsBlacklisting(content::PermissionType::NOTIFICATIONS,
-                              CONTENT_SETTINGS_TYPE_NOTIFICATIONS, db_manager,
+  TestPermissionsBlacklisting(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, db_manager,
                               url, 2000 /* timeout */, CONTENT_SETTING_ALLOW,
                               PermissionEmbargoStatus::NOT_EMBARGOED);
 }
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker.cc b/chrome/browser/permissions/permission_decision_auto_blocker.cc
index f8ab89c..017553d 100644
--- a/chrome/browser/permissions/permission_decision_auto_blocker.cc
+++ b/chrome/browser/permissions/permission_decision_auto_blocker.cc
@@ -22,7 +22,6 @@
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/safe_browsing_db/database_manager.h"
 #include "components/variations/variations_associated_data.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/web_contents.h"
 #include "url/gurl.h"
 
@@ -74,7 +73,7 @@
 }
 
 int RecordActionInWebsiteSettings(const GURL& url,
-                                  content::PermissionType permission,
+                                  ContentSettingsType permission,
                                   const char* key,
                                   Profile* profile) {
   HostContentSettingsMap* map =
@@ -96,7 +95,7 @@
 }
 
 int GetActionCount(const GURL& url,
-                   content::PermissionType permission,
+                   ContentSettingsType permission,
                    const char* key,
                    Profile* profile) {
   HostContentSettingsMap* map =
@@ -206,19 +205,19 @@
 
 int PermissionDecisionAutoBlocker::GetDismissCount(
     const GURL& url,
-    content::PermissionType permission) {
+    ContentSettingsType permission) {
   return GetActionCount(url, permission, kPromptDismissCountKey, profile_);
 }
 
 int PermissionDecisionAutoBlocker::GetIgnoreCount(
     const GURL& url,
-    content::PermissionType permission) {
+    ContentSettingsType permission) {
   return GetActionCount(url, permission, kPromptIgnoreCountKey, profile_);
 }
 
 bool PermissionDecisionAutoBlocker::RecordDismissAndEmbargo(
     const GURL& url,
-    content::PermissionType permission) {
+    ContentSettingsType permission) {
   int current_dismissal_count = RecordActionInWebsiteSettings(
       url, permission, kPromptDismissCountKey, profile_);
 
@@ -232,7 +231,7 @@
 
 int PermissionDecisionAutoBlocker::RecordIgnore(
     const GURL& url,
-    content::PermissionType permission) {
+    ContentSettingsType permission) {
   return RecordActionInWebsiteSettings(url, permission, kPromptIgnoreCountKey,
                                        profile_);
 }
@@ -267,7 +266,7 @@
 }
 
 void PermissionDecisionAutoBlocker::UpdateEmbargoedStatus(
-    content::PermissionType permission,
+    ContentSettingsType permission,
     const GURL& request_origin,
     content::WebContents* web_contents,
     base::Callback<void(bool)> callback) {
@@ -291,7 +290,7 @@
 }
 
 bool PermissionDecisionAutoBlocker::IsUnderEmbargo(
-    content::PermissionType permission,
+    ContentSettingsType permission,
     const GURL& request_origin) {
   HostContentSettingsMap* map =
       HostContentSettingsMapFactory::GetForProfile(profile_);
@@ -328,7 +327,7 @@
 }
 
 void PermissionDecisionAutoBlocker::CheckSafeBrowsingResult(
-    content::PermissionType permission,
+    ContentSettingsType permission,
     const GURL& request_origin,
     base::Callback<void(bool)> callback,
     bool should_be_embargoed) {
@@ -342,7 +341,7 @@
 }
 
 void PermissionDecisionAutoBlocker::PlaceUnderEmbargo(
-    content::PermissionType permission,
+    ContentSettingsType permission,
     const GURL& request_origin,
     const char* key) {
   HostContentSettingsMap* map =
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker.h b/chrome/browser/permissions/permission_decision_auto_blocker.h
index 5d9660d..ade0ff05 100644
--- a/chrome/browser/permissions/permission_decision_auto_blocker.h
+++ b/chrome/browser/permissions/permission_decision_auto_blocker.h
@@ -10,9 +10,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/singleton.h"
 #include "base/time/default_clock.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/keyed_service/content/browser_context_keyed_service_factory.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "content/public/browser/permission_type.h"
 #include "url/gurl.h"
 
 class GURL;
@@ -62,21 +62,20 @@
 
   // Returns the current number of dismisses recorded for |permission| type at
   // |url|.
-  int GetDismissCount(const GURL& url, content::PermissionType permission);
+  int GetDismissCount(const GURL& url, ContentSettingsType permission);
 
   // Returns the current number of ignores recorded for |permission|
   // type at |url|.
-  int GetIgnoreCount(const GURL& url, content::PermissionType permission);
+  int GetIgnoreCount(const GURL& url, ContentSettingsType permission);
 
   // Records that a dismissal of a prompt for |permission| was made. If the
   // total number of dismissals exceeds a threshhold and
   // features::kBlockPromptsIfDismissedOften is enabled it will place |url|
   // under embargo for |permission|.
-  bool RecordDismissAndEmbargo(const GURL& url,
-                               content::PermissionType permission);
+  bool RecordDismissAndEmbargo(const GURL& url, ContentSettingsType permission);
 
   // Records that an ignore of a prompt for |permission| was made.
-  int RecordIgnore(const GURL& url, content::PermissionType permission);
+  int RecordIgnore(const GURL& url, ContentSettingsType permission);
 
   // Updates the threshold to start blocking prompts from the field trial.
   static void UpdateFromVariations();
@@ -85,7 +84,7 @@
   // this will make a call to IsUnderEmbargo to check the content setting first,
   // but may also make a call to Safe Browsing to check the API blacklist, which
   // is performed asynchronously.
-  void UpdateEmbargoedStatus(content::PermissionType permission,
+  void UpdateEmbargoedStatus(ContentSettingsType permission,
                              const GURL& request_origin,
                              content::WebContents* web_contents,
                              base::Callback<void(bool)> callback);
@@ -93,7 +92,7 @@
   // Checks the status of the content setting to determine if |request_origin|
   // is under embargo for |permission|. This checks both embargo for Permissions
   // Blacklisting and repeated dismissals.
-  bool IsUnderEmbargo(content::PermissionType permission,
+  bool IsUnderEmbargo(ContentSettingsType permission,
                       const GURL& request_origin);
 
  private:
@@ -105,12 +104,12 @@
 
   // Get the result of the Safe Browsing check, if |should_be_embargoed| is true
   // then |request_origin| will be placed under embargo for that |permission|.
-  void CheckSafeBrowsingResult(content::PermissionType permission,
+  void CheckSafeBrowsingResult(ContentSettingsType permission,
                                const GURL& request_origin,
                                base::Callback<void(bool)> callback,
                                bool should_be_embargoed);
 
-  void PlaceUnderEmbargo(content::PermissionType permission,
+  void PlaceUnderEmbargo(ContentSettingsType permission,
                          const GURL& request_origin,
                          const char* key);
 
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc b/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc
index 061a905..43b884e2 100644
--- a/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc
+++ b/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc
@@ -19,7 +19,6 @@
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/safe_browsing_db/test_database_manager.h"
-#include "content/public/browser/permission_type.h"
 
 namespace {
 
@@ -107,8 +106,7 @@
                                                                      timeout);
   }
 
-  void UpdateEmbargoedStatus(content::PermissionType permission,
-                             const GURL& url) {
+  void UpdateEmbargoedStatus(ContentSettingsType permission, const GURL& url) {
     base::RunLoop run_loop;
     autoblocker_->UpdateEmbargoedStatus(
         permission, url, nullptr,
@@ -120,7 +118,7 @@
   // Manually placing an (origin, permission) pair under embargo for
   // blacklisting. To embargo on dismissals, RecordDismissAndEmbargo can be
   // used.
-  void PlaceUnderBlacklistEmbargo(content::PermissionType permission,
+  void PlaceUnderBlacklistEmbargo(ContentSettingsType permission,
                                   const GURL& url) {
     autoblocker_->PlaceUnderEmbargo(
         permission, url,
@@ -166,102 +164,102 @@
 
   // Record some dismissals.
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url1, content::PermissionType::GEOLOCATION));
+      url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(1, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::GEOLOCATION));
+                   url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url1, content::PermissionType::GEOLOCATION));
+      url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(2, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::GEOLOCATION));
+                   url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   EXPECT_TRUE(autoblocker()->RecordDismissAndEmbargo(
-      url1, content::PermissionType::GEOLOCATION));
+      url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(3, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::GEOLOCATION));
+                   url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url2, content::PermissionType::GEOLOCATION));
+      url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(1, autoblocker()->GetDismissCount(
-                   url2, content::PermissionType::GEOLOCATION));
+                   url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url1, content::PermissionType::NOTIFICATIONS));
+      url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
   EXPECT_EQ(1, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::NOTIFICATIONS));
+                   url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 
   // Record some ignores.
   EXPECT_EQ(1, autoblocker()->RecordIgnore(
-                   url1, content::PermissionType::MIDI_SYSEX));
+                   url1, CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
   EXPECT_EQ(1, autoblocker()->RecordIgnore(
-                   url1, content::PermissionType::DURABLE_STORAGE));
+                   url1, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
   EXPECT_EQ(1, autoblocker()->RecordIgnore(
-                   url2, content::PermissionType::GEOLOCATION));
+                   url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(2, autoblocker()->RecordIgnore(
-                   url2, content::PermissionType::GEOLOCATION));
+                   url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   autoblocker()->RemoveCountsByUrl(base::Bind(&FilterGoogle));
 
   // Expect that url1's actions are gone, but url2's remain.
   EXPECT_EQ(0, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::GEOLOCATION));
+                   url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(0, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::NOTIFICATIONS));
+                   url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
   EXPECT_EQ(0, autoblocker()->GetIgnoreCount(
-                   url1, content::PermissionType::MIDI_SYSEX));
+                   url1, CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
   EXPECT_EQ(0, autoblocker()->GetIgnoreCount(
-                   url1, content::PermissionType::DURABLE_STORAGE));
+                   url1, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
 
   EXPECT_EQ(1, autoblocker()->GetDismissCount(
-                   url2, content::PermissionType::GEOLOCATION));
+                   url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(2, autoblocker()->GetIgnoreCount(
-                   url2, content::PermissionType::GEOLOCATION));
+                   url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   // Add some more actions.
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url1, content::PermissionType::GEOLOCATION));
+      url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(1, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::GEOLOCATION));
+                   url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url1, content::PermissionType::NOTIFICATIONS));
+      url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
   EXPECT_EQ(1, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::NOTIFICATIONS));
+                   url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
 
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url2, content::PermissionType::GEOLOCATION));
+      url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(2, autoblocker()->GetDismissCount(
-                   url2, content::PermissionType::GEOLOCATION));
+                   url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   EXPECT_EQ(1, autoblocker()->RecordIgnore(
-                   url1, content::PermissionType::GEOLOCATION));
+                   url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(1, autoblocker()->RecordIgnore(
-                   url1, content::PermissionType::NOTIFICATIONS));
+                   url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
   EXPECT_EQ(1, autoblocker()->RecordIgnore(
-                   url1, content::PermissionType::DURABLE_STORAGE));
+                   url1, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
   EXPECT_EQ(1, autoblocker()->RecordIgnore(
-                   url2, content::PermissionType::MIDI_SYSEX));
+                   url2, CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
 
   // Remove everything and expect that it's all gone.
   autoblocker()->RemoveCountsByUrl(base::Bind(&FilterAll));
 
   EXPECT_EQ(0, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::GEOLOCATION));
+                   url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(0, autoblocker()->GetDismissCount(
-                   url1, content::PermissionType::NOTIFICATIONS));
+                   url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
   EXPECT_EQ(0, autoblocker()->GetDismissCount(
-                   url2, content::PermissionType::GEOLOCATION));
+                   url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   EXPECT_EQ(0, autoblocker()->GetIgnoreCount(
-                   url1, content::PermissionType::GEOLOCATION));
+                   url1, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(0, autoblocker()->GetIgnoreCount(
-                   url1, content::PermissionType::NOTIFICATIONS));
+                   url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS));
   EXPECT_EQ(0, autoblocker()->GetIgnoreCount(
-                   url2, content::PermissionType::GEOLOCATION));
+                   url2, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(0, autoblocker()->GetIgnoreCount(
-                   url2, content::PermissionType::DURABLE_STORAGE));
+                   url2, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE));
   EXPECT_EQ(0, autoblocker()->GetIgnoreCount(
-                   url2, content::PermissionType::MIDI_SYSEX));
+                   url2, CONTENT_SETTINGS_TYPE_MIDI_SYSEX));
 }
 
 // Test that an origin that has been blacklisted for a permission is embargoed.
@@ -277,7 +275,7 @@
   SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
                                                      2000 /* timeout in ms */);
 
-  UpdateEmbargoedStatus(content::PermissionType::GEOLOCATION, url);
+  UpdateEmbargoedStatus(CONTENT_SETTINGS_TYPE_GEOLOCATION, url);
   EXPECT_TRUE(callback_was_run());
   EXPECT_TRUE(last_embargoed_status());
   histograms.ExpectUniqueSample("Permissions.AutoBlocker.SafeBrowsingResponse",
@@ -301,7 +299,7 @@
   SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
                                                      0 /* timeout in ms */);
 
-  UpdateEmbargoedStatus(content::PermissionType::NOTIFICATIONS, url);
+  UpdateEmbargoedStatus(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, url);
   EXPECT_FALSE(last_embargoed_status());
   histograms.ExpectUniqueSample("Permissions.AutoBlocker.SafeBrowsingResponse",
                                 SafeBrowsingResponse::NOT_BLACKLISTED, 1);
@@ -315,36 +313,36 @@
   GURL url("https://www.google.com");
   clock()->SetNow(base::Time::Now());
 
-  PlaceUnderBlacklistEmbargo(content::PermissionType::GEOLOCATION, url);
+  PlaceUnderBlacklistEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url);
   EXPECT_TRUE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   // Check that the origin is not under embargo for a different permission.
-  EXPECT_FALSE(autoblocker()->IsUnderEmbargo(
-      content::PermissionType::NOTIFICATIONS, url));
+  EXPECT_FALSE(
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, url));
 
   // Confirm embargo status during the embargo period.
   clock()->Advance(base::TimeDelta::FromDays(5));
   EXPECT_TRUE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   // Check embargo is lifted on expiry day. A small offset after the exact
   // embargo expiration date has been added to account for any precision errors
   // when removing the date stored as a double from the permission dictionary.
   clock()->Advance(base::TimeDelta::FromHours(3 * 24 + 1));
   EXPECT_FALSE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   // Check embargo is lifted well after the expiry day.
   clock()->Advance(base::TimeDelta::FromDays(1));
   EXPECT_FALSE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   // Place under embargo again and verify the embargo status.
-  PlaceUnderBlacklistEmbargo(content::PermissionType::NOTIFICATIONS, url);
+  PlaceUnderBlacklistEmbargo(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, url);
   clock()->Advance(base::TimeDelta::FromDays(1));
-  EXPECT_TRUE(autoblocker()->IsUnderEmbargo(
-      content::PermissionType::NOTIFICATIONS, url));
+  EXPECT_TRUE(
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, url));
 }
 
 // Tests the alternating pattern of the block on multiple dismiss behaviour. On
@@ -359,19 +357,19 @@
 
   // Record some dismisses.
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url, content::PermissionType::GEOLOCATION));
+      url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url, content::PermissionType::GEOLOCATION));
+      url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   // A request with < 3 prior dismisses should not be automatically blocked.
   EXPECT_FALSE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   // After the 3rd dismiss subsequent permission requests should be autoblocked.
   EXPECT_TRUE(autoblocker()->RecordDismissAndEmbargo(
-      url, content::PermissionType::GEOLOCATION));
+      url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_TRUE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   histograms.ExpectTotalCount("Permissions.AutoBlocker.SafeBrowsingResponse",
                               0);
@@ -381,25 +379,25 @@
   // request won't be automatically blocked.
   clock()->Advance(base::TimeDelta::FromDays(8));
   EXPECT_FALSE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   // Record another dismiss, subsequent requests should be autoblocked again.
   EXPECT_TRUE(autoblocker()->RecordDismissAndEmbargo(
-      url, content::PermissionType::GEOLOCATION));
+      url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_TRUE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   // Accelerate time again, check embargo is lifted and another permission
   // request is let through.
   clock()->Advance(base::TimeDelta::FromDays(8));
   EXPECT_FALSE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   // Record another dismiss, subsequent requests should be autoblocked again.
   EXPECT_TRUE(autoblocker()->RecordDismissAndEmbargo(
-      url, content::PermissionType::GEOLOCATION));
+      url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_TRUE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
   histograms.ExpectTotalCount("Permissions.AutoBlocker.SafeBrowsingResponse",
                               0);
   histograms.ExpectTotalCount(
@@ -412,24 +410,24 @@
   clock()->SetNow(base::Time::Now());
 
   // Place under blacklist embargo and check the status.
-  PlaceUnderBlacklistEmbargo(content::PermissionType::GEOLOCATION, url);
+  PlaceUnderBlacklistEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url);
   clock()->Advance(base::TimeDelta::FromDays(5));
   EXPECT_TRUE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 
   // Record dismisses to place it under dismissal embargo.
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url, content::PermissionType::GEOLOCATION));
+      url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo(
-      url, content::PermissionType::GEOLOCATION));
+      url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_TRUE(autoblocker()->RecordDismissAndEmbargo(
-      url, content::PermissionType::GEOLOCATION));
+      url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   // Accelerate time to a point where the blacklist embargo should be expired
   // and check that dismissal embargo is still set.
   clock()->Advance(base::TimeDelta::FromDays(3));
   EXPECT_TRUE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 }
 
 TEST_F(PermissionDecisionAutoBlockerUnitTest, TestSafeBrowsingTimeout) {
@@ -445,11 +443,11 @@
   SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
                                                      0 /* timeout in ms */);
 
-  UpdateEmbargoedStatus(content::PermissionType::GEOLOCATION, url);
+  UpdateEmbargoedStatus(CONTENT_SETTINGS_TYPE_GEOLOCATION, url);
   EXPECT_TRUE(callback_was_run());
   EXPECT_FALSE(last_embargoed_status());
   EXPECT_FALSE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
   histograms.ExpectUniqueSample("Permissions.AutoBlocker.SafeBrowsingResponse",
                                 SafeBrowsingResponse::TIMEOUT, 1);
   histograms.ExpectTotalCount(
@@ -459,7 +457,7 @@
                                                      2000 /* timeout in ms */);
 
   clock()->Advance(base::TimeDelta::FromDays(1));
-  UpdateEmbargoedStatus(content::PermissionType::GEOLOCATION, url);
+  UpdateEmbargoedStatus(CONTENT_SETTINGS_TYPE_GEOLOCATION, url);
   EXPECT_TRUE(callback_was_run());
   EXPECT_TRUE(last_embargoed_status());
   histograms.ExpectTotalCount("Permissions.AutoBlocker.SafeBrowsingResponse",
@@ -470,7 +468,7 @@
                                SafeBrowsingResponse::BLACKLISTED, 1);
   clock()->Advance(base::TimeDelta::FromDays(1));
   EXPECT_TRUE(
-      autoblocker()->IsUnderEmbargo(content::PermissionType::GEOLOCATION, url));
+      autoblocker()->IsUnderEmbargo(CONTENT_SETTINGS_TYPE_GEOLOCATION, url));
 }
 
 // TODO(raymes): See crbug.com/681709. Remove after M60.
@@ -486,7 +484,7 @@
 
   base::DictionaryValue origin_dict;
   origin_dict.Set(
-      PermissionUtil::GetPermissionString(content::PermissionType::GEOLOCATION),
+      PermissionUtil::GetPermissionString(CONTENT_SETTINGS_TYPE_GEOLOCATION),
       permissions_dict.CreateDeepCopy());
   map->SetWebsiteSettingDefaultScope(
       url, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
@@ -494,9 +492,9 @@
 
   // Nothing should be migrated yet, so the current values should be 0.
   EXPECT_EQ(0, autoblocker()->GetDismissCount(
-                   url, content::PermissionType::GEOLOCATION));
+                   url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(0, autoblocker()->GetIgnoreCount(
-                   url, content::PermissionType::GEOLOCATION));
+                   url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   // Trigger pref migration which happens at the creation of the
   // HostContentSettingsMap.
@@ -509,9 +507,9 @@
 
   // The values should now be migrated.
   EXPECT_EQ(100, autoblocker()->GetDismissCount(
-                     url, content::PermissionType::GEOLOCATION));
+                     url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(50, autoblocker()->GetIgnoreCount(
-                    url, content::PermissionType::GEOLOCATION));
+                    url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 
   // The old pref should be deleted.
   std::unique_ptr<base::DictionaryValue> old_dict =
@@ -525,7 +523,7 @@
   permissions_dict.SetInteger(GetIgnoreKey(), 99);
 
   origin_dict.Set(
-      PermissionUtil::GetPermissionString(content::PermissionType::GEOLOCATION),
+      PermissionUtil::GetPermissionString(CONTENT_SETTINGS_TYPE_GEOLOCATION),
       permissions_dict.CreateDeepCopy());
   map->SetWebsiteSettingDefaultScope(
       url, GURL(), CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT,
@@ -540,9 +538,9 @@
   }
 
   EXPECT_EQ(100, autoblocker()->GetDismissCount(
-                     url, content::PermissionType::GEOLOCATION));
+                     url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
   EXPECT_EQ(50, autoblocker()->GetIgnoreCount(
-                    url, content::PermissionType::GEOLOCATION));
+                    url, CONTENT_SETTINGS_TYPE_GEOLOCATION));
 }
 
 // Test that a blacklisted permission should not be autoblocked if the database
@@ -556,7 +554,7 @@
   db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
   SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
                                                      2000 /* timeout in ms */);
-  UpdateEmbargoedStatus(content::PermissionType::GEOLOCATION, url);
+  UpdateEmbargoedStatus(CONTENT_SETTINGS_TYPE_GEOLOCATION, url);
   EXPECT_TRUE(callback_was_run());
   EXPECT_FALSE(last_embargoed_status());
 }
@@ -574,7 +572,7 @@
   SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
                                                      0 /* timeout in ms */);
 
-  UpdateEmbargoedStatus(content::PermissionType::NOTIFICATIONS, url);
+  UpdateEmbargoedStatus(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, url);
   EXPECT_FALSE(last_embargoed_status());
   histograms.ExpectUniqueSample("Permissions.AutoBlocker.SafeBrowsingResponse",
                                 SafeBrowsingResponse::NOT_BLACKLISTED, 1);
diff --git a/chrome/browser/permissions/permission_dialog_delegate.cc b/chrome/browser/permissions/permission_dialog_delegate.cc
index cbfde51..f7c006e 100644
--- a/chrome/browser/permissions/permission_dialog_delegate.cc
+++ b/chrome/browser/permissions/permission_dialog_delegate.cc
@@ -40,7 +40,7 @@
 // static
 void PermissionDialogDelegate::Create(
     content::WebContents* web_contents,
-    content::PermissionType type,
+    ContentSettingsType type,
     const GURL& requesting_frame,
     bool user_gesture,
     Profile* profile,
diff --git a/chrome/browser/permissions/permission_dialog_delegate.h b/chrome/browser/permissions/permission_dialog_delegate.h
index 96a4347..f57ccd1 100644
--- a/chrome/browser/permissions/permission_dialog_delegate.h
+++ b/chrome/browser/permissions/permission_dialog_delegate.h
@@ -11,7 +11,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "chrome/browser/permissions/permission_util.h"
-#include "content/public/browser/permission_type.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 
 using base::android::JavaParamRef;
 using base::android::ScopedJavaLocalRef;
@@ -41,7 +41,7 @@
 
   // Creates a modal dialog for |type|.
   static void Create(content::WebContents* web_contents,
-                     content::PermissionType type,
+                     ContentSettingsType type,
                      const GURL& requesting_frame,
                      bool user_gesture,
                      Profile* profile,
diff --git a/chrome/browser/permissions/permission_infobar_delegate.cc b/chrome/browser/permissions/permission_infobar_delegate.cc
index 3d7ef82..1f4be38 100644
--- a/chrome/browser/permissions/permission_infobar_delegate.cc
+++ b/chrome/browser/permissions/permission_infobar_delegate.cc
@@ -23,7 +23,7 @@
 // static
 infobars::InfoBar* PermissionInfoBarDelegate::Create(
     InfoBarService* infobar_service,
-    content::PermissionType type,
+    ContentSettingsType type,
     const GURL& requesting_frame,
     bool user_gesture,
     Profile* profile,
@@ -42,26 +42,26 @@
 // static
 std::unique_ptr<PermissionInfoBarDelegate>
 PermissionInfoBarDelegate::CreateDelegate(
-    content::PermissionType type,
+    ContentSettingsType type,
     const GURL& requesting_frame,
     bool user_gesture,
     Profile* profile,
     const PermissionSetCallback& callback) {
   switch (type) {
-    case content::PermissionType::GEOLOCATION:
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       return std::unique_ptr<PermissionInfoBarDelegate>(
               new GeolocationInfoBarDelegateAndroid(
                   requesting_frame, user_gesture, profile, callback));
-    case content::PermissionType::NOTIFICATIONS:
-    case content::PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       return std::unique_ptr<PermissionInfoBarDelegate>(
           new NotificationPermissionInfoBarDelegate(
               type, requesting_frame, user_gesture, profile, callback));
-    case content::PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       return std::unique_ptr<PermissionInfoBarDelegate>(
               new MidiPermissionInfoBarDelegateAndroid(
                   requesting_frame, user_gesture, profile, callback));
-    case content::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       return std::unique_ptr<PermissionInfoBarDelegate>(
               new ProtectedMediaIdentifierInfoBarDelegateAndroid(
                   requesting_frame, user_gesture, profile, callback));
@@ -74,7 +74,7 @@
 PermissionInfoBarDelegate::~PermissionInfoBarDelegate() {
   if (!action_taken_) {
     PermissionUmaUtil::PermissionIgnored(
-        permission_type_,
+        content_settings_type_,
         user_gesture_ ? PermissionRequestGestureType::GESTURE
                       : PermissionRequestGestureType::NO_GESTURE,
         requesting_origin_, profile_);
@@ -86,9 +86,9 @@
 }
 
 bool PermissionInfoBarDelegate::ShouldShowPersistenceToggle() const {
-  return (permission_type_ == content::PermissionType::GEOLOCATION ||
-          permission_type_ == content::PermissionType::AUDIO_CAPTURE ||
-          permission_type_ == content::PermissionType::VIDEO_CAPTURE) &&
+  return (content_settings_type_ == CONTENT_SETTINGS_TYPE_GEOLOCATION ||
+          content_settings_type_ == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC ||
+          content_settings_type_ == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) &&
          PermissionUtil::ShouldShowPersistenceToggle();
 }
 
@@ -97,7 +97,7 @@
   if (ShouldShowPersistenceToggle()) {
     update_content_setting = persist_;
     PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle(
-        permission_type_, persist_);
+        content_settings_type_, persist_);
   }
 
   SetPermission(update_content_setting, GRANTED);
@@ -109,7 +109,7 @@
   if (ShouldShowPersistenceToggle()) {
     update_content_setting = persist_;
     PermissionUmaUtil::PermissionPromptDeniedWithPersistenceToggle(
-        permission_type_, persist_);
+        content_settings_type_, persist_);
   }
 
   SetPermission(update_content_setting, DENIED);
@@ -136,13 +136,11 @@
 
 PermissionInfoBarDelegate::PermissionInfoBarDelegate(
     const GURL& requesting_origin,
-    content::PermissionType permission_type,
     ContentSettingsType content_settings_type,
     bool user_gesture,
     Profile* profile,
     const PermissionSetCallback& callback)
     : requesting_origin_(requesting_origin),
-      permission_type_(permission_type),
       content_settings_type_(content_settings_type),
       profile_(profile),
       callback_(callback),
diff --git a/chrome/browser/permissions/permission_infobar_delegate.h b/chrome/browser/permissions/permission_infobar_delegate.h
index 7b0f429d..9dfbf4b 100644
--- a/chrome/browser/permissions/permission_infobar_delegate.h
+++ b/chrome/browser/permissions/permission_infobar_delegate.h
@@ -13,7 +13,6 @@
 #include "chrome/browser/permissions/permission_util.h"
 #include "components/content_settings/core/common/content_settings_types.h"
 #include "components/infobars/core/confirm_infobar_delegate.h"
-#include "content/public/browser/permission_type.h"
 #include "url/gurl.h"
 
 namespace infobars {
@@ -41,14 +40,14 @@
   // |infobar_service| and manages its own lifetime; callers must only use it
   // for calls to |infobar_service|.
   static infobars::InfoBar* Create(InfoBarService* infobar_service,
-                                   content::PermissionType type,
+                                   ContentSettingsType type,
                                    const GURL& requesting_frame,
                                    bool user_gesture,
                                    Profile* profile,
                                    const PermissionSetCallback& callback);
 
   static std::unique_ptr<PermissionInfoBarDelegate> CreateDelegate(
-      content::PermissionType type,
+      ContentSettingsType type,
       const GURL& requesting_frame,
       bool user_gesture,
       Profile* profile,
@@ -77,7 +76,6 @@
 
  protected:
   PermissionInfoBarDelegate(const GURL& requesting_origin,
-                            content::PermissionType permission_type,
                             ContentSettingsType content_settings_type,
                             bool user_gesture,
                             Profile* profile,
@@ -92,7 +90,6 @@
   void SetPermission(bool update_content_setting, PermissionAction decision);
 
   GURL requesting_origin_;
-  content::PermissionType permission_type_;
   ContentSettingsType content_settings_type_;
   Profile* const profile_;
   const PermissionSetCallback callback_;
diff --git a/chrome/browser/permissions/permission_manager.cc b/chrome/browser/permissions/permission_manager.cc
index de46664..e890aea 100644
--- a/chrome/browser/permissions/permission_manager.cc
+++ b/chrome/browser/permissions/permission_manager.cc
@@ -4,8 +4,6 @@
 
 #include "chrome/browser/permissions/permission_manager.h"
 
-#include <stddef.h>
-
 #include <memory>
 #include <utility>
 
@@ -86,6 +84,7 @@
     case PermissionType::MIDI_SYSEX:
       return CONTENT_SETTINGS_TYPE_MIDI_SYSEX;
     case PermissionType::PUSH_MESSAGING:
+      return CONTENT_SETTINGS_TYPE_PUSH_MESSAGING;
     case PermissionType::NOTIFICATIONS:
       return CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
     case PermissionType::GEOLOCATION:
@@ -146,13 +145,14 @@
 // CONTENT_SETTING_DEFAULT is returned if the permission needs further handling.
 // This function should only be called when IsConstantPermission has returned
 // true for the PermissionType.
-ContentSetting GetContentSettingForConstantPermission(PermissionType type) {
+blink::mojom::PermissionStatus GetPermissionStatusForConstantPermission(
+    PermissionType type) {
   DCHECK(IsConstantPermission(type));
   switch (type) {
     case PermissionType::MIDI:
-      return CONTENT_SETTING_ALLOW;
+      return PermissionStatus::GRANTED;
     default:
-      return CONTENT_SETTING_DEFAULT;
+      return PermissionStatus::DENIED;
   }
 }
 
@@ -212,7 +212,7 @@
   GURL requesting_origin;
   GURL embedding_origin;
   base::Callback<void(PermissionStatus)> callback;
-  ContentSetting current_value;
+  PermissionStatus current_value;
 };
 
 // static
@@ -223,39 +223,37 @@
 PermissionManager::PermissionManager(Profile* profile)
     : profile_(profile),
       weak_ptr_factory_(this) {
-  permission_contexts_[PermissionType::MIDI_SYSEX] =
+  permission_contexts_[CONTENT_SETTINGS_TYPE_MIDI_SYSEX] =
       base::MakeUnique<MidiPermissionContext>(profile);
-  permission_contexts_[PermissionType::PUSH_MESSAGING] =
+  permission_contexts_[CONTENT_SETTINGS_TYPE_PUSH_MESSAGING] =
       base::MakeUnique<NotificationPermissionContext>(
-          profile, PermissionType::PUSH_MESSAGING);
-  permission_contexts_[PermissionType::NOTIFICATIONS] =
+          profile, CONTENT_SETTINGS_TYPE_PUSH_MESSAGING);
+  permission_contexts_[CONTENT_SETTINGS_TYPE_NOTIFICATIONS] =
       base::MakeUnique<NotificationPermissionContext>(
-          profile, PermissionType::NOTIFICATIONS);
+          profile, CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
 #if !defined(OS_ANDROID)
-  permission_contexts_[PermissionType::GEOLOCATION] =
+  permission_contexts_[CONTENT_SETTINGS_TYPE_GEOLOCATION] =
       base::MakeUnique<GeolocationPermissionContext>(profile);
 #else
-  permission_contexts_[PermissionType::GEOLOCATION] =
+  permission_contexts_[CONTENT_SETTINGS_TYPE_GEOLOCATION] =
       base::MakeUnique<GeolocationPermissionContextAndroid>(profile);
 #endif
 #if defined(OS_CHROMEOS) || defined(OS_ANDROID)
-  permission_contexts_[PermissionType::PROTECTED_MEDIA_IDENTIFIER] =
+  permission_contexts_[CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER] =
       base::MakeUnique<ProtectedMediaIdentifierPermissionContext>(profile);
 #endif
-  permission_contexts_[PermissionType::DURABLE_STORAGE] =
+  permission_contexts_[CONTENT_SETTINGS_TYPE_DURABLE_STORAGE] =
       base::MakeUnique<DurableStoragePermissionContext>(profile);
-  permission_contexts_[PermissionType::AUDIO_CAPTURE] =
+  permission_contexts_[CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC] =
       base::MakeUnique<MediaStreamDevicePermissionContext>(
-          profile, content::PermissionType::AUDIO_CAPTURE,
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
-  permission_contexts_[PermissionType::VIDEO_CAPTURE] =
+          profile, CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
+  permission_contexts_[CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA] =
       base::MakeUnique<MediaStreamDevicePermissionContext>(
-          profile, content::PermissionType::VIDEO_CAPTURE,
-          CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
-  permission_contexts_[PermissionType::BACKGROUND_SYNC] =
+          profile, CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
+  permission_contexts_[CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC] =
       base::MakeUnique<BackgroundSyncPermissionContext>(profile);
 #if BUILDFLAG(ENABLE_PLUGINS)
-  permission_contexts_[PermissionType::FLASH] =
+  permission_contexts_[CONTENT_SETTINGS_TYPE_PLUGINS] =
       base::MakeUnique<FlashPermissionContext>(profile);
 #endif
 }
@@ -267,6 +265,35 @@
 }
 
 int PermissionManager::RequestPermission(
+    ContentSettingsType content_settings_type,
+    content::RenderFrameHost* render_frame_host,
+    const GURL& requesting_origin,
+    bool user_gesture,
+    const base::Callback<void(PermissionStatus)>& callback) {
+  // TODO(timloh): We should be operating on ContentSettingsType instead of
+  // converting these back to PermissionType.
+  PermissionType permission_type;
+  bool success = PermissionUtil::GetPermissionType(content_settings_type,
+                                                   &permission_type);
+  DCHECK(success);
+  return RequestPermissions(
+      std::vector<PermissionType>(1, permission_type), render_frame_host,
+      requesting_origin, user_gesture,
+      base::Bind(&PermissionRequestResponseCallbackWrapper, callback));
+}
+
+PermissionStatus PermissionManager::GetPermissionStatus(
+    ContentSettingsType permission,
+    const GURL& requesting_origin,
+    const GURL& embedding_origin) {
+  PermissionContextBase* context = GetPermissionContext(permission);
+  return ContentSettingToPermissionStatus(
+      context->GetPermissionStatus(requesting_origin.GetOrigin(),
+                                   embedding_origin.GetOrigin())
+      .content_setting);
+}
+
+int PermissionManager::RequestPermission(
     PermissionType permission,
     content::RenderFrameHost* render_frame_host,
     const GURL& requesting_origin,
@@ -306,16 +333,17 @@
     const PermissionType permission = permissions[i];
 
     if (IsConstantPermission(permission) ||
-        !GetPermissionContext(permission)) {
+        !GetPermissionContext(PermissionTypeToContentSetting(permission))) {
       // Track permission request usages even for constant permissions.
       PermissionUmaUtil::PermissionRequested(permission, requesting_origin,
                                              embedding_origin, profile_);
-      OnPermissionsRequestResponseStatus(request_id, i,
-          GetPermissionStatus(permission, requesting_origin, embedding_origin));
+      OnPermissionsRequestResponseStatus(
+          request_id, i, GetPermissionStatusForConstantPermission(permission));
       continue;
     }
 
-    PermissionContextBase* context = GetPermissionContext(permission);
+    PermissionContextBase* context =
+        GetPermissionContext(PermissionTypeToContentSetting(permission));
     context->RequestPermission(
         web_contents, request, requesting_origin, user_gesture,
         base::Bind(&ContentSettingToPermissionStatusCallbackWrapper,
@@ -331,7 +359,7 @@
 }
 
 PermissionContextBase* PermissionManager::GetPermissionContext(
-    PermissionType type) {
+    ContentSettingsType type) {
   const auto& it = permission_contexts_.find(type);
   return it == permission_contexts_.end() ? nullptr : it->second.get();
 }
@@ -364,7 +392,8 @@
                                     pending_request->render_frame_id(),
                                     request_id);
   for (PermissionType permission : pending_request->permissions()) {
-    PermissionContextBase* context = GetPermissionContext(permission);
+    PermissionContextBase* context =
+        GetPermissionContext(PermissionTypeToContentSetting(permission));
     if (!context)
       continue;
     context->CancelPermissionRequest(web_contents, request);
@@ -376,7 +405,8 @@
                                         const GURL& requesting_origin,
                                         const GURL& embedding_origin) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  PermissionContextBase* context = GetPermissionContext(permission);
+  PermissionContextBase* context =
+      GetPermissionContext(PermissionTypeToContentSetting(permission));
   if (!context)
     return;
 
@@ -389,8 +419,10 @@
     const GURL& requesting_origin,
     const GURL& embedding_origin) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  return ContentSettingToPermissionStatus(GetPermissionStatusInternal(
-      permission, requesting_origin, embedding_origin));
+  if (IsConstantPermission(permission))
+    return GetPermissionStatusForConstantPermission(permission);
+  return GetPermissionStatus(PermissionTypeToContentSetting(permission),
+                             requesting_origin, embedding_origin);
 }
 
 void PermissionManager::RegisterPermissionUsage(PermissionType permission,
@@ -423,8 +455,8 @@
   subscription->embedding_origin = embedding_origin;
   subscription->callback = callback;
 
-  subscription->current_value = GetPermissionStatusInternal(
-      permission, requesting_origin, embedding_origin);
+  subscription->current_value =
+      GetPermissionStatus(permission, requesting_origin, embedding_origin);
 
   return subscriptions_.Add(std::move(subscription));
 }
@@ -440,7 +472,7 @@
 }
 
 bool PermissionManager::IsPermissionKillSwitchOn(
-    content::PermissionType permission) {
+    ContentSettingsType permission) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   return GetPermissionContext(permission)->IsPermissionKillSwitchOn();
 }
@@ -470,7 +502,7 @@
         !secondary_pattern.Matches(subscription->embedding_origin))
       continue;
 
-    ContentSetting new_value = GetPermissionStatusInternal(
+    PermissionStatus new_value = GetPermissionStatus(
         subscription->permission, subscription->requesting_origin,
         subscription->embedding_origin);
     if (subscription->current_value == new_value)
@@ -480,25 +512,9 @@
 
     // Add the callback to |callbacks| which will be run after the loop to
     // prevent re-entrance issues.
-    callbacks.push_back(
-        base::Bind(subscription->callback,
-                   ContentSettingToPermissionStatus(new_value)));
+    callbacks.push_back(base::Bind(subscription->callback, new_value));
   }
 
   for (const auto& callback : callbacks)
     callback.Run();
 }
-
-ContentSetting PermissionManager::GetPermissionStatusInternal(
-    PermissionType permission,
-    const GURL& requesting_origin,
-    const GURL& embedding_origin) {
-  if (IsConstantPermission(permission))
-    return GetContentSettingForConstantPermission(permission);
-
-  PermissionContextBase* context = GetPermissionContext(permission);
-  return context
-      ->GetPermissionStatus(requesting_origin.GetOrigin(),
-                            embedding_origin.GetOrigin())
-      .content_setting;
-}
diff --git a/chrome/browser/permissions/permission_manager.h b/chrome/browser/permissions/permission_manager.h
index bc7e040..ed7a264 100644
--- a/chrome/browser/permissions/permission_manager.h
+++ b/chrome/browser/permissions/permission_manager.h
@@ -33,6 +33,21 @@
   explicit PermissionManager(Profile* profile);
   ~PermissionManager() override;
 
+  // Callers from within chrome/ should use the methods which take the
+  // ContentSettingsType enum. The methods which take PermissionType values
+  // are for the content::PermissionManager overrides and shouldn't be used
+  // from chrome/.
+  int RequestPermission(
+      ContentSettingsType permission,
+      content::RenderFrameHost* render_frame_host,
+      const GURL& requesting_origin,
+      bool user_gesture,
+      const base::Callback<void(blink::mojom::PermissionStatus)>& callback);
+  blink::mojom::PermissionStatus GetPermissionStatus(
+      ContentSettingsType permission,
+      const GURL& requesting_origin,
+      const GURL& embedding_origin);
+
   // content::PermissionManager implementation.
   int RequestPermission(
       content::PermissionType permission,
@@ -71,7 +86,7 @@
   // TODO(raymes): Rather than exposing this, expose a denial reason from
   // GetPermissionStatus so that callers can determine whether a permission is
   // denied due to the kill switch.
-  bool IsPermissionKillSwitchOn(content::PermissionType permission);
+  bool IsPermissionKillSwitchOn(ContentSettingsType);
 
  private:
   friend class GeolocationPermissionContextTests;
@@ -82,7 +97,7 @@
   struct Subscription;
   using SubscriptionsMap = IDMap<std::unique_ptr<Subscription>>;
 
-  PermissionContextBase* GetPermissionContext(content::PermissionType type);
+  PermissionContextBase* GetPermissionContext(ContentSettingsType type);
 
   // Called when a permission was decided for a given PendingRequest. The
   // PendingRequest is identified by its |request_id| and the permission is
@@ -101,17 +116,13 @@
                                ContentSettingsType content_type,
                                std::string resource_identifier) override;
 
-  ContentSetting GetPermissionStatusInternal(content::PermissionType permission,
-                                             const GURL& requesting_origin,
-                                             const GURL& embedding_origin);
-
   Profile* profile_;
   PendingRequestsMap pending_requests_;
   SubscriptionsMap subscriptions_;
 
-  std::unordered_map<content::PermissionType,
+  std::unordered_map<ContentSettingsType,
                      std::unique_ptr<PermissionContextBase>,
-                     PermissionTypeHash>
+                     ContentSettingsTypeHash>
       permission_contexts_;
 
   base::WeakPtrFactory<PermissionManager> weak_ptr_factory_;
diff --git a/chrome/browser/permissions/permission_queue_controller.cc b/chrome/browser/permissions/permission_queue_controller.cc
index 6f12eb47..c56db61 100644
--- a/chrome/browser/permissions/permission_queue_controller.cc
+++ b/chrome/browser/permissions/permission_queue_controller.cc
@@ -54,7 +54,7 @@
 
 class PermissionQueueController::PendingInfobarRequest {
  public:
-  PendingInfobarRequest(content::PermissionType type,
+  PendingInfobarRequest(ContentSettingsType type,
                         const PermissionRequestID& id,
                         const GURL& requesting_frame,
                         const GURL& embedder,
@@ -85,7 +85,7 @@
   void CreatePrompt(PermissionQueueController* controller, bool show_dialog);
 
  private:
-  content::PermissionType type_;
+  ContentSettingsType type_;
   PermissionRequestID id_;
   GURL requesting_frame_;
   GURL embedder_;
@@ -99,7 +99,7 @@
 };
 
 PermissionQueueController::PendingInfobarRequest::PendingInfobarRequest(
-    content::PermissionType type,
+    ContentSettingsType type,
     const PermissionRequestID& id,
     const GURL& requesting_frame,
     const GURL& embedder,
@@ -160,10 +160,8 @@
 
 PermissionQueueController::PermissionQueueController(
     Profile* profile,
-    content::PermissionType permission_type,
     ContentSettingsType content_settings_type)
     : profile_(profile),
-      permission_type_(permission_type),
       content_settings_type_(content_settings_type),
       in_shutdown_(false) {}
 
@@ -187,8 +185,8 @@
     return;
 
   pending_infobar_requests_.push_back(
-      PendingInfobarRequest(permission_type_, id, requesting_frame, embedder,
-                            user_gesture, profile_, callback));
+      PendingInfobarRequest(content_settings_type_, id, requesting_frame,
+                            embedder, user_gesture, profile_, callback));
   if (!AlreadyShowingInfoBarForTab(id))
     ShowQueuedInfoBarForTab(id);
 }
@@ -220,12 +218,12 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   PermissionRequestType request_type =
-      PermissionUtil::GetRequestType(permission_type_);
+      PermissionUtil::GetRequestType(content_settings_type_);
   PermissionRequestGestureType gesture_type =
       PermissionUtil::GetGestureType(user_gesture);
   switch (decision) {
     case GRANTED:
-      PermissionUmaUtil::PermissionGranted(permission_type_, gesture_type,
+      PermissionUmaUtil::PermissionGranted(content_settings_type_, gesture_type,
                                            requesting_frame, profile_);
       PermissionUmaUtil::RecordPermissionPromptAccepted(request_type,
                                                         gesture_type);
@@ -233,7 +231,7 @@
           PermissionEmbargoStatus::NOT_EMBARGOED);
       break;
     case DENIED:
-      PermissionUmaUtil::PermissionDenied(permission_type_, gesture_type,
+      PermissionUmaUtil::PermissionDenied(content_settings_type_, gesture_type,
                                           requesting_frame, profile_);
       PermissionUmaUtil::RecordPermissionPromptDenied(request_type,
                                                       gesture_type);
@@ -241,10 +239,11 @@
           PermissionEmbargoStatus::NOT_EMBARGOED);
       break;
     case DISMISSED:
-      PermissionUmaUtil::PermissionDismissed(permission_type_, gesture_type,
-                                             requesting_frame, profile_);
+      PermissionUmaUtil::PermissionDismissed(
+          content_settings_type_, gesture_type, requesting_frame, profile_);
       if (PermissionDecisionAutoBlocker::GetForProfile(profile_)
-              ->RecordDismissAndEmbargo(requesting_frame, permission_type_)) {
+              ->RecordDismissAndEmbargo(requesting_frame,
+                                        content_settings_type_)) {
         PermissionUmaUtil::RecordPermissionEmbargoStatus(
             PermissionEmbargoStatus::REPEATED_DISMISSALS);
       } else {
@@ -448,8 +447,13 @@
   ContentSetting content_setting =
       (decision == GRANTED) ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK;
 
+  // TODO(timloh): Remove this logic when push and notification permissions
+  // are reconciled, see crbug.com/563297.
+  ContentSettingsType type_for_map = content_settings_type_;
+  if (type_for_map == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING)
+    type_for_map = CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
   HostContentSettingsMapFactory::GetForProfile(profile_)
       ->SetContentSettingDefaultScope(
           requesting_frame.GetOrigin(), embedder.GetOrigin(),
-          content_settings_type_, std::string(), content_setting);
+          type_for_map, std::string(), content_setting);
 }
diff --git a/chrome/browser/permissions/permission_queue_controller.h b/chrome/browser/permissions/permission_queue_controller.h
index 1cecd22..ec73873 100644
--- a/chrome/browser/permissions/permission_queue_controller.h
+++ b/chrome/browser/permissions/permission_queue_controller.h
@@ -12,7 +12,6 @@
 #include "components/content_settings/core/common/content_settings_types.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
-#include "content/public/browser/permission_type.h"
 
 class GURL;
 class PermissionRequestID;
@@ -32,7 +31,6 @@
   using PermissionDecidedCallback = base::Callback<void(ContentSetting)>;
 
   PermissionQueueController(Profile* profile,
-                            content::PermissionType permission_type,
                             ContentSettingsType content_settings_type);
   ~PermissionQueueController() override;
 
@@ -94,7 +92,6 @@
   content::NotificationRegistrar registrar_;
 
   Profile* const profile_;
-  content::PermissionType permission_type_;
   ContentSettingsType content_settings_type_;
   PendingInfobarRequests pending_infobar_requests_;
   bool in_shutdown_;
diff --git a/chrome/browser/permissions/permission_queue_controller_unittest.cc b/chrome/browser/permissions/permission_queue_controller_unittest.cc
index f2b3a2db..f9ce02d 100644
--- a/chrome/browser/permissions/permission_queue_controller_unittest.cc
+++ b/chrome/browser/permissions/permission_queue_controller_unittest.cc
@@ -12,7 +12,6 @@
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/content_settings/core/common/content_settings_types.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/mock_render_process_host.h"
@@ -67,7 +66,6 @@
 ObservationCountingQueueController::ObservationCountingQueueController(
     Profile* profile)
     : PermissionQueueController(profile,
-                                content::PermissionType::GEOLOCATION,
                                 CONTENT_SETTINGS_TYPE_GEOLOCATION),
       call_count_(0) {}
 
diff --git a/chrome/browser/permissions/permission_request.h b/chrome/browser/permissions/permission_request.h
index 7ef6ebbd..f9f77f9 100644
--- a/chrome/browser/permissions/permission_request.h
+++ b/chrome/browser/permissions/permission_request.h
@@ -8,7 +8,6 @@
 #include "base/macros.h"
 #include "base/strings/string16.h"
 #include "components/content_settings/core/common/content_settings_types.h"
-#include "content/public/browser/permission_type.h"
 #include "url/gurl.h"
 
 namespace gfx {
diff --git a/chrome/browser/permissions/permission_request_impl.cc b/chrome/browser/permissions/permission_request_impl.cc
index ab91ab6..57556c1b 100644
--- a/chrome/browser/permissions/permission_request_impl.cc
+++ b/chrome/browser/permissions/permission_request_impl.cc
@@ -21,13 +21,13 @@
 
 PermissionRequestImpl::PermissionRequestImpl(
     const GURL& request_origin,
-    content::PermissionType permission_type,
+    ContentSettingsType content_settings_type,
     Profile* profile,
     bool has_gesture,
     const PermissionDecidedCallback& permission_decided_callback,
     const base::Closure delete_callback)
     : request_origin_(request_origin),
-      permission_type_(permission_type),
+      content_settings_type_(content_settings_type),
       profile_(profile),
       has_gesture_(has_gesture),
       permission_decided_callback_(permission_decided_callback),
@@ -38,8 +38,8 @@
 PermissionRequestImpl::~PermissionRequestImpl() {
   DCHECK(is_finished_);
   if (!action_taken_) {
-    PermissionUmaUtil::PermissionIgnored(permission_type_, GetGestureType(),
-                                         request_origin_, profile_);
+    PermissionUmaUtil::PermissionIgnored(
+        content_settings_type_, GetGestureType(), request_origin_, profile_);
     PermissionUmaUtil::RecordPermissionEmbargoStatus(
         PermissionEmbargoStatus::NOT_EMBARGOED);
   }
@@ -47,35 +47,35 @@
 
 PermissionRequest::IconId PermissionRequestImpl::GetIconId() const {
 #if defined(OS_ANDROID)
-  switch (permission_type_) {
-    case content::PermissionType::GEOLOCATION:
+  switch (content_settings_type_) {
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       return IDR_ANDROID_INFOBAR_GEOLOCATION;
-    case content::PermissionType::NOTIFICATIONS:
-    case content::PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       return IDR_ANDROID_INFOBAR_NOTIFICATIONS;
-    case content::PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       return IDR_ANDROID_INFOBAR_MIDI;
-    case content::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       return IDR_ANDROID_INFOBAR_PROTECTED_MEDIA_IDENTIFIER;
     default:
       NOTREACHED();
       return IDR_ANDROID_INFOBAR_WARNING;
   }
 #else
-  switch (permission_type_) {
-    case content::PermissionType::GEOLOCATION:
+  switch (content_settings_type_) {
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       return ui::kLocationOnIcon;
-    case content::PermissionType::NOTIFICATIONS:
-    case content::PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       return ui::kNotificationsIcon;
 #if defined(OS_CHROMEOS)
     // TODO(xhwang): fix this icon, see crrev.com/863263007
-    case content::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       return kProductIcon;
 #endif
-    case content::PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       return ui::kMidiIcon;
-    case content::PermissionType::FLASH:
+    case CONTENT_SETTINGS_TYPE_PLUGINS:
       return ui::kExtensionIcon;
     default:
       NOTREACHED();
@@ -86,23 +86,23 @@
 
 base::string16 PermissionRequestImpl::GetMessageTextFragment() const {
   int message_id;
-  switch (permission_type_) {
-    case content::PermissionType::GEOLOCATION:
+  switch (content_settings_type_) {
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       message_id = IDS_GEOLOCATION_INFOBAR_PERMISSION_FRAGMENT;
       break;
-    case content::PermissionType::NOTIFICATIONS:
-    case content::PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       message_id = IDS_NOTIFICATION_PERMISSIONS_FRAGMENT;
       break;
-    case content::PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       message_id = IDS_MIDI_SYSEX_PERMISSION_FRAGMENT;
       break;
 #if defined(OS_CHROMEOS)
-    case content::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       message_id = IDS_PROTECTED_MEDIA_IDENTIFIER_PERMISSION_FRAGMENT;
       break;
 #endif
-    case content::PermissionType::FLASH:
+    case CONTENT_SETTINGS_TYPE_PLUGINS:
       message_id = IDS_FLASH_PERMISSION_FRAGMENT;
       break;
     default:
@@ -137,37 +137,16 @@
 }
 
 bool PermissionRequestImpl::ShouldShowPersistenceToggle() const {
-  return (permission_type_ == content::PermissionType::GEOLOCATION) &&
+  return (content_settings_type_ == CONTENT_SETTINGS_TYPE_GEOLOCATION) &&
          PermissionUtil::ShouldShowPersistenceToggle();
 }
 
 PermissionRequestType PermissionRequestImpl::GetPermissionRequestType()
     const {
-  return PermissionUtil::GetRequestType(permission_type_);
+  return PermissionUtil::GetRequestType(content_settings_type_);
 }
 
 PermissionRequestGestureType PermissionRequestImpl::GetGestureType()
     const {
   return PermissionUtil::GetGestureType(has_gesture_);
 }
-
-ContentSettingsType PermissionRequestImpl::GetContentSettingsType() const {
-  switch (permission_type_) {
-    case content::PermissionType::GEOLOCATION:
-      return CONTENT_SETTINGS_TYPE_GEOLOCATION;
-    case content::PermissionType::PUSH_MESSAGING:
-    case content::PermissionType::NOTIFICATIONS:
-      return CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
-    case content::PermissionType::MIDI_SYSEX:
-      return CONTENT_SETTINGS_TYPE_MIDI_SYSEX;
-#if defined(OS_CHROMEOS)
-    case content::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
-      return CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER;
-#endif
-    case content::PermissionType::FLASH:
-      return CONTENT_SETTINGS_TYPE_PLUGINS;
-    default:
-      NOTREACHED();
-      return CONTENT_SETTINGS_TYPE_DEFAULT;
-  }
-}
diff --git a/chrome/browser/permissions/permission_request_impl.h b/chrome/browser/permissions/permission_request_impl.h
index c4a315b..ea3eec0 100644
--- a/chrome/browser/permissions/permission_request_impl.h
+++ b/chrome/browser/permissions/permission_request_impl.h
@@ -10,7 +10,7 @@
 #include "chrome/browser/permissions/permission_request.h"
 #include "chrome/browser/permissions/permission_request_id.h"
 #include "components/content_settings/core/common/content_settings.h"
-#include "content/public/browser/permission_type.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 
 class GURL;
 class Profile;
@@ -24,7 +24,7 @@
 
   PermissionRequestImpl(
       const GURL& request_origin,
-      content::PermissionType permission_type,
+      ContentSettingsType content_settings_type,
       Profile* profile,
       bool has_gesture,
       const PermissionDecidedCallback& permission_decided_callback,
@@ -49,10 +49,9 @@
   bool ShouldShowPersistenceToggle() const override;
   PermissionRequestType GetPermissionRequestType() const override;
   PermissionRequestGestureType GetGestureType() const override;
-  ContentSettingsType GetContentSettingsType() const override;
 
   GURL request_origin_;
-  content::PermissionType permission_type_;
+  ContentSettingsType content_settings_type_;
   Profile* profile_;
   bool has_gesture_;
 
diff --git a/chrome/browser/permissions/permission_request_manager_browsertest.cc b/chrome/browser/permissions/permission_request_manager_browsertest.cc
index 2cbfc79..4e74b17 100644
--- a/chrome/browser/permissions/permission_request_manager_browsertest.cc
+++ b/chrome/browser/permissions/permission_request_manager_browsertest.cc
@@ -14,8 +14,8 @@
 #include "chrome/browser/ui/website_settings/mock_permission_prompt_factory.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/variations/variations_associated_data.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_utils.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -55,9 +55,9 @@
     return mock_permission_prompt_factory_.get();
   }
 
-  void EnableKillSwitch(content::PermissionType permission_type) {
+  void EnableKillSwitch(ContentSettingsType content_settings_type) {
     std::map<std::string, std::string> params;
-    params[PermissionUtil::GetPermissionString(permission_type)] =
+    params[PermissionUtil::GetPermissionString(content_settings_type)] =
         kPermissionsKillSwitchBlockedValue;
     variations::AssociateVariationParams(
         kPermissionsKillSwitchFieldStudy, kPermissionsKillSwitchTestGroup,
@@ -192,7 +192,7 @@
       embedded_test_server()->GetURL("/permissions/killswitch_tester.html"));
 
   // Now enable the geolocation killswitch.
-  EnableKillSwitch(content::PermissionType::GEOLOCATION);
+  EnableKillSwitch(CONTENT_SETTINGS_TYPE_GEOLOCATION);
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
 
@@ -228,7 +228,7 @@
       embedded_test_server()->GetURL("/permissions/killswitch_tester.html"));
 
   // Now enable the notifications killswitch.
-  EnableKillSwitch(content::PermissionType::NOTIFICATIONS);
+  EnableKillSwitch(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
 
diff --git a/chrome/browser/permissions/permission_request_manager_test_api.cc b/chrome/browser/permissions/permission_request_manager_test_api.cc
index d2e1bd4..7144ddb 100644
--- a/chrome/browser/permissions/permission_request_manager_test_api.cc
+++ b/chrome/browser/permissions/permission_request_manager_test_api.cc
@@ -18,7 +18,7 @@
 // handle all destruction paths.
 class TestPermisisonRequestOwner {
  public:
-  TestPermisisonRequestOwner(Profile* profile, content::PermissionType type) {
+  TestPermisisonRequestOwner(Profile* profile, ContentSettingsType type) {
     bool user_gesture = true;
     auto decided = [](bool, ContentSetting) {};
     request_ = base::MakeUnique<PermissionRequestImpl>(
@@ -50,7 +50,7 @@
 
 void PermissionRequestManagerTestApi::AddSimpleRequest(
     Profile* profile,
-    content::PermissionType type) {
+    ContentSettingsType type) {
   TestPermisisonRequestOwner* request_owner =
       new TestPermisisonRequestOwner(profile, type);
   manager_->AddRequest(request_owner->request());
diff --git a/chrome/browser/permissions/permission_request_manager_test_api.h b/chrome/browser/permissions/permission_request_manager_test_api.h
index ed68c301..c651605 100644
--- a/chrome/browser/permissions/permission_request_manager_test_api.h
+++ b/chrome/browser/permissions/permission_request_manager_test_api.h
@@ -7,7 +7,7 @@
 
 #include "base/macros.h"
 #include "chrome/browser/permissions/permission_request_manager.h"
-#include "content/public/browser/permission_type.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 
 class Browser;
 class Profile;
@@ -24,10 +24,10 @@
   PermissionRequestManager* manager() { return manager_; }
 
   // Add a "simple" permission request. One that uses PermissionRequestImpl,
-  // such as for content::PermissionType including MIDI_SYSEX, PUSH_MESSAGING,
-  // NOTIFICATIONS, GEOLOCATON, or FLASH. This can be called multiple times
+  // such as for ContentSettingsType including MIDI_SYSEX, PUSH_MESSAGING,
+  // NOTIFICATIONS, GEOLOCATON, or PLUGINS. This can be called multiple times
   // before a call to manager()->DisplayPendingRequests().
-  void AddSimpleRequest(Profile* profile, content::PermissionType type);
+  void AddSimpleRequest(Profile* profile, ContentSettingsType type);
 
   // Return the bubble window for the permission prompt or null if there is no
   // prompt currently showing.
diff --git a/chrome/browser/permissions/permission_uma_util.cc b/chrome/browser/permissions/permission_uma_util.cc
index 4a40418..1f6f48d 100644
--- a/chrome/browser/permissions/permission_uma_util.cc
+++ b/chrome/browser/permissions/permission_uma_util.cc
@@ -63,7 +63,7 @@
 
 namespace {
 
-const std::string GetRapporMetric(PermissionType permission,
+const std::string GetRapporMetric(ContentSettingsType permission,
                                   PermissionAction action) {
   std::string action_str;
   switch (action) {
@@ -188,7 +188,7 @@
 // PermissionReportInfo -------------------------------------------------------
 PermissionReportInfo::PermissionReportInfo(
     const GURL& origin,
-    PermissionType permission,
+    ContentSettingsType permission,
     PermissionAction action,
     PermissionSourceUI source_ui,
     PermissionRequestGestureType gesture_type,
@@ -267,8 +267,19 @@
                           profile);
 }
 
+void PermissionUmaUtil::PermissionRequested(ContentSettingsType content_type,
+                                            const GURL& requesting_origin,
+                                            const GURL& embedding_origin,
+                                            Profile* profile) {
+  PermissionType permission;
+  bool success = PermissionUtil::GetPermissionType(content_type, &permission);
+  DCHECK(success);
+  RecordPermissionRequest(permission, requesting_origin, embedding_origin,
+                          profile);
+}
+
 void PermissionUmaUtil::PermissionGranted(
-    PermissionType permission,
+    ContentSettingsType permission,
     PermissionRequestGestureType gesture_type,
     const GURL& requesting_origin,
     Profile* profile) {
@@ -285,7 +296,7 @@
 }
 
 void PermissionUmaUtil::PermissionDenied(
-    PermissionType permission,
+    ContentSettingsType permission,
     PermissionRequestGestureType gesture_type,
     const GURL& requesting_origin,
     Profile* profile) {
@@ -302,7 +313,7 @@
 }
 
 void PermissionUmaUtil::PermissionDismissed(
-    PermissionType permission,
+    ContentSettingsType permission,
     PermissionRequestGestureType gesture_type,
     const GURL& requesting_origin,
     Profile* profile) {
@@ -319,7 +330,7 @@
 }
 
 void PermissionUmaUtil::PermissionIgnored(
-    PermissionType permission,
+    ContentSettingsType permission,
     PermissionRequestGestureType gesture_type,
     const GURL& requesting_origin,
     Profile* profile) {
@@ -340,16 +351,16 @@
   autoblocker->RecordIgnore(requesting_origin, permission);
 }
 
-void PermissionUmaUtil::PermissionRevoked(PermissionType permission,
+void PermissionUmaUtil::PermissionRevoked(ContentSettingsType permission,
                                           PermissionSourceUI source_ui,
                                           const GURL& revoked_origin,
                                           Profile* profile) {
   // TODO(tsergeant): Expand metrics definitions for revocation to include all
   // permissions.
-  if (permission == PermissionType::NOTIFICATIONS ||
-      permission == PermissionType::GEOLOCATION ||
-      permission == PermissionType::AUDIO_CAPTURE ||
-      permission == PermissionType::VIDEO_CAPTURE) {
+  if (permission == CONTENT_SETTINGS_TYPE_NOTIFICATIONS ||
+      permission == CONTENT_SETTINGS_TYPE_GEOLOCATION ||
+      permission == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC ||
+      permission == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA) {
     // An unknown gesture type is passed in since gesture type is only
     // applicable in prompt UIs where revocations are not possible.
     RecordPermissionAction(permission, REVOKED, source_ui,
@@ -475,14 +486,12 @@
 }
 
 void PermissionUmaUtil::RecordPermissionPromptPriorCount(
-    content::PermissionType permission,
+    ContentSettingsType permission,
     const std::string& prefix,
     int count) {
-  // The user is not prompted for these permissions, thus there is no prompt
+  // The user is not prompted for this permissions, thus there is no prompt
   // event to record a prior count for.
-  DCHECK_NE(PermissionType::MIDI, permission);
-  DCHECK_NE(PermissionType::BACKGROUND_SYNC, permission);
-  DCHECK_NE(PermissionType::NUM, permission);
+  DCHECK_NE(CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC, permission);
 
   // Expand UMA_HISTOGRAM_COUNTS_100 so that we can use a dynamically suffixed
   // histogram name.
@@ -493,54 +502,52 @@
 }
 
 void PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle(
-    content::PermissionType permission,
+    ContentSettingsType permission,
     bool toggle_enabled) {
   switch (permission) {
-    case PermissionType::GEOLOCATION:
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Accepted.Persisted.Geolocation",
                             toggle_enabled);
       break;
-    case PermissionType::NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
       UMA_HISTOGRAM_BOOLEAN(
           "Permissions.Prompt.Accepted.Persisted.Notifications",
           toggle_enabled);
       break;
-    case PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Accepted.Persisted.MidiSysEx",
                             toggle_enabled);
       break;
-    case PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       UMA_HISTOGRAM_BOOLEAN(
           "Permissions.Prompt.Accepted.Persisted.PushMessaging",
           toggle_enabled);
       break;
-    case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       UMA_HISTOGRAM_BOOLEAN(
           "Permissions.Prompt.Accepted.Persisted.ProtectedMedia",
           toggle_enabled);
       break;
-    case PermissionType::DURABLE_STORAGE:
+    case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE:
       UMA_HISTOGRAM_BOOLEAN(
           "Permissions.Prompt.Accepted.Persisted.DurableStorage",
           toggle_enabled);
       break;
-    case PermissionType::AUDIO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
       UMA_HISTOGRAM_BOOLEAN(
           "Permissions.Prompt.Accepted.Persisted.AudioCapture", toggle_enabled);
       break;
-    case PermissionType::VIDEO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
       UMA_HISTOGRAM_BOOLEAN(
           "Permissions.Prompt.Accepted.Persisted.VideoCapture", toggle_enabled);
       break;
-    case PermissionType::FLASH:
+    case CONTENT_SETTINGS_TYPE_PLUGINS:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Accepted.Persisted.Flash",
                             toggle_enabled);
       break;
     // The user is not prompted for these permissions, thus there is no accept
     // recorded for them.
-    case PermissionType::MIDI:
-    case PermissionType::BACKGROUND_SYNC:
-    case PermissionType::NUM:
+    default:
       NOTREACHED() << "PERMISSION "
                    << PermissionUtil::GetPermissionString(permission)
                    << " not accounted for";
@@ -548,50 +555,48 @@
 }
 
 void PermissionUmaUtil::PermissionPromptDeniedWithPersistenceToggle(
-    content::PermissionType permission,
+    ContentSettingsType permission,
     bool toggle_enabled) {
   switch (permission) {
-    case PermissionType::GEOLOCATION:
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Denied.Persisted.Geolocation",
                             toggle_enabled);
       break;
-    case PermissionType::NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Denied.Persisted.Notifications",
                             toggle_enabled);
       break;
-    case PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Denied.Persisted.MidiSysEx",
                             toggle_enabled);
       break;
-    case PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Denied.Persisted.PushMessaging",
                             toggle_enabled);
       break;
-    case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       UMA_HISTOGRAM_BOOLEAN(
           "Permissions.Prompt.Denied.Persisted.ProtectedMedia", toggle_enabled);
       break;
-    case PermissionType::DURABLE_STORAGE:
+    case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE:
       UMA_HISTOGRAM_BOOLEAN(
           "Permissions.Prompt.Denied.Persisted.DurableStorage", toggle_enabled);
       break;
-    case PermissionType::AUDIO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Denied.Persisted.AudioCapture",
                             toggle_enabled);
       break;
-    case PermissionType::VIDEO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Denied.Persisted.VideoCapture",
                             toggle_enabled);
       break;
-    case PermissionType::FLASH:
+    case CONTENT_SETTINGS_TYPE_PLUGINS:
       UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Denied.Persisted.Flash",
                             toggle_enabled);
       break;
     // The user is not prompted for these permissions, thus there is no deny
     // recorded for them.
-    case PermissionType::MIDI:
-    case PermissionType::BACKGROUND_SYNC:
-    case PermissionType::NUM:
+    default:
       NOTREACHED() << "PERMISSION "
                    << PermissionUtil::GetPermissionString(permission)
                    << " not accounted for";
@@ -637,7 +642,7 @@
 }
 
 void PermissionUmaUtil::RecordPermissionAction(
-    PermissionType permission,
+    ContentSettingsType permission,
     PermissionAction action,
     PermissionSourceUI source_ui,
     PermissionRequestGestureType gesture_type,
@@ -660,62 +665,60 @@
   bool secure_origin = content::IsOriginSecure(requesting_origin);
 
   switch (permission) {
-    case PermissionType::GEOLOCATION:
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Geolocation",
                             "Permissions.Action.SecureOrigin.Geolocation",
                             "Permissions.Action.InsecureOrigin.Geolocation",
                             action);
       break;
-    case PermissionType::NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
       PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Notifications",
                             "Permissions.Action.SecureOrigin.Notifications",
                             "Permissions.Action.InsecureOrigin.Notifications",
                             action);
       break;
-    case PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.MidiSysEx",
                             "Permissions.Action.SecureOrigin.MidiSysEx",
                             "Permissions.Action.InsecureOrigin.MidiSysEx",
                             action);
       break;
-    case PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.PushMessaging",
                             "Permissions.Action.SecureOrigin.PushMessaging",
                             "Permissions.Action.InsecureOrigin.PushMessaging",
                             action);
       break;
-    case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.ProtectedMedia",
                             "Permissions.Action.SecureOrigin.ProtectedMedia",
                             "Permissions.Action.InsecureOrigin.ProtectedMedia",
                             action);
       break;
-    case PermissionType::DURABLE_STORAGE:
+    case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE:
       PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.DurableStorage",
                             "Permissions.Action.SecureOrigin.DurableStorage",
                             "Permissions.Action.InsecureOrigin.DurableStorage",
                             action);
       break;
-    case PermissionType::AUDIO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
       // Media permissions are disabled on insecure origins, so there's no
       // need to record metrics for secure/insecue.
       UMA_HISTOGRAM_ENUMERATION("Permissions.Action.AudioCapture", action,
                                 PERMISSION_ACTION_NUM);
       break;
-    case PermissionType::VIDEO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
       UMA_HISTOGRAM_ENUMERATION("Permissions.Action.VideoCapture", action,
                                 PERMISSION_ACTION_NUM);
       break;
-    case PermissionType::FLASH:
+    case CONTENT_SETTINGS_TYPE_PLUGINS:
       PERMISSION_ACTION_UMA(secure_origin, "Permissions.Action.Flash",
                             "Permissions.Action.SecureOrigin.Flash",
                             "Permissions.Action.InsecureOrigin.Flash", action);
       break;
     // The user is not prompted for these permissions, thus there is no
     // permission action recorded for them.
-    case PermissionType::MIDI:
-    case PermissionType::BACKGROUND_SYNC:
-    case PermissionType::NUM:
+    default:
       NOTREACHED() << "PERMISSION "
                    << PermissionUtil::GetPermissionString(permission)
                    << " not accounted for";
diff --git a/chrome/browser/permissions/permission_uma_util.h b/chrome/browser/permissions/permission_uma_util.h
index e486c84..f1efe4c 100644
--- a/chrome/browser/permissions/permission_uma_util.h
+++ b/chrome/browser/permissions/permission_uma_util.h
@@ -18,10 +18,6 @@
 class PermissionRequest;
 class Profile;
 
-namespace content {
-enum class PermissionType;
-}  // namespace content
-
 // This should stay in sync with the SourceUI enum in the permission report
 // protobuf (src/chrome/common/safe_browsing/permission_report.proto).
 enum class PermissionSourceUI {
@@ -56,7 +52,7 @@
 struct PermissionReportInfo {
   PermissionReportInfo(
       const GURL& origin,
-      content::PermissionType permission,
+      ContentSettingsType permission,
       PermissionAction action,
       PermissionSourceUI source_ui,
       PermissionRequestGestureType gesture_type,
@@ -67,7 +63,7 @@
   PermissionReportInfo(const PermissionReportInfo& other);
 
   GURL origin;
-  content::PermissionType permission;
+  ContentSettingsType permission;
   PermissionAction action;
   PermissionSourceUI source_ui;
   PermissionRequestGestureType gesture_type;
@@ -110,27 +106,33 @@
   static const char kPermissionsPromptIgnoredPriorDismissCountPrefix[];
   static const char kPermissionsPromptIgnoredPriorIgnoreCountPrefix[];
 
+  // TODO(timloh): Remove this content::PermissionType overload when we add MIDI
+  // to ContentSettingsType.
   static void PermissionRequested(content::PermissionType permission,
                                   const GURL& requesting_origin,
                                   const GURL& embedding_origin,
                                   Profile* profile);
-  static void PermissionGranted(content::PermissionType permission,
+  static void PermissionRequested(ContentSettingsType permission,
+                                  const GURL& requesting_origin,
+                                  const GURL& embedding_origin,
+                                  Profile* profile);
+  static void PermissionGranted(ContentSettingsType permission,
                                 PermissionRequestGestureType gesture_type,
                                 const GURL& requesting_origin,
                                 Profile* profile);
-  static void PermissionDenied(content::PermissionType permission,
+  static void PermissionDenied(ContentSettingsType permission,
                                PermissionRequestGestureType gesture_type,
                                const GURL& requesting_origin,
                                Profile* profile);
-  static void PermissionDismissed(content::PermissionType permission,
+  static void PermissionDismissed(ContentSettingsType permission,
                                   PermissionRequestGestureType gesture_type,
                                   const GURL& requesting_origin,
                                   Profile* profile);
-  static void PermissionIgnored(content::PermissionType permission,
+  static void PermissionIgnored(ContentSettingsType permission,
                                 PermissionRequestGestureType gesture_type,
                                 const GURL& requesting_origin,
                                 Profile* profile);
-  static void PermissionRevoked(content::PermissionType permission,
+  static void PermissionRevoked(ContentSettingsType permission,
                                 PermissionSourceUI source_ui,
                                 const GURL& revoked_origin,
                                 Profile* profile);
@@ -184,11 +186,11 @@
   // persistence toggle. Records whether the toggle was enabled (persist) or
   // disabled (don't persist).
   static void PermissionPromptAcceptedWithPersistenceToggle(
-      content::PermissionType permission,
+      ContentSettingsType permission,
       bool toggle_enabled);
 
   static void PermissionPromptDeniedWithPersistenceToggle(
-      content::PermissionType permission,
+      ContentSettingsType permission,
       bool toggle_enabled);
 
  private:
@@ -196,7 +198,7 @@
 
   static bool IsOptedIntoPermissionActionReporting(Profile* profile);
 
-  static void RecordPermissionAction(content::PermissionType permission,
+  static void RecordPermissionAction(ContentSettingsType permission,
                                      PermissionAction action,
                                      PermissionSourceUI source_ui,
                                      PermissionRequestGestureType gesture_type,
@@ -206,7 +208,7 @@
   // Records |count| total prior actions for a prompt of type |permission|
   // for a single origin using |prefix| for the metric.
   static void RecordPermissionPromptPriorCount(
-      content::PermissionType permission,
+      ContentSettingsType permission,
       const std::string& prefix,
       int count);
 
diff --git a/chrome/browser/permissions/permission_util.cc b/chrome/browser/permissions/permission_util.cc
index 2e8d5075..955b2f6 100644
--- a/chrome/browser/permissions/permission_util.cc
+++ b/chrome/browser/permissions/permission_util.cc
@@ -15,92 +15,92 @@
 
 using content::PermissionType;
 
-std::size_t PermissionTypeHash::operator()(
-    const content::PermissionType& type) const {
-  return static_cast<size_t>(type);
+std::string PermissionUtil::GetPermissionString(
+    ContentSettingsType content_type) {
+  PermissionType permission_type;
+  bool success = PermissionUtil::GetPermissionType(
+      content_type, &permission_type);
+  DCHECK(success);
+  return GetPermissionString(permission_type);
 }
 
 // The returned strings must match the RAPPOR metrics in rappor.xml,
 // and any Field Trial configs for the Permissions kill switch e.g.
 // Permissions.Action.Geolocation etc..
-std::string PermissionUtil::GetPermissionString(
-    content::PermissionType permission) {
+std::string PermissionUtil::GetPermissionString(PermissionType permission) {
   switch (permission) {
-    case content::PermissionType::GEOLOCATION:
+    case PermissionType::GEOLOCATION:
       return "Geolocation";
-    case content::PermissionType::NOTIFICATIONS:
+    case PermissionType::NOTIFICATIONS:
       return "Notifications";
-    case content::PermissionType::MIDI_SYSEX:
+    case PermissionType::MIDI_SYSEX:
       return "MidiSysEx";
-    case content::PermissionType::PUSH_MESSAGING:
+    case PermissionType::PUSH_MESSAGING:
       return "PushMessaging";
-    case content::PermissionType::DURABLE_STORAGE:
+    case PermissionType::DURABLE_STORAGE:
       return "DurableStorage";
-    case content::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
       return "ProtectedMediaIdentifier";
-    case content::PermissionType::AUDIO_CAPTURE:
+    case PermissionType::AUDIO_CAPTURE:
       return "AudioCapture";
-    case content::PermissionType::VIDEO_CAPTURE:
+    case PermissionType::VIDEO_CAPTURE:
       return "VideoCapture";
-    case content::PermissionType::MIDI:
+    case PermissionType::MIDI:
       return "Midi";
-    case content::PermissionType::BACKGROUND_SYNC:
+    case PermissionType::BACKGROUND_SYNC:
       return "BackgroundSync";
-    case content::PermissionType::FLASH:
+    case PermissionType::FLASH:
       return "Flash";
-    case content::PermissionType::NUM:
+    default:
       break;
   }
   NOTREACHED();
   return std::string();
 }
 
-std::string PermissionUtil::ConvertPermissionTypeToSafeBrowsingName(
-    const content::PermissionType& permission_type) {
+std::string PermissionUtil::ConvertContentSettingsTypeToSafeBrowsingName(
+    ContentSettingsType permission_type) {
   switch (permission_type) {
-    case content::PermissionType::GEOLOCATION:
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       return "GEOLOCATION";
-    case content::PermissionType::NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
       return "NOTIFICATIONS";
-    case content::PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       return "MIDI_SYSEX";
-    case content::PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       return "PUSH_MESSAGING";
-    case content::PermissionType::DURABLE_STORAGE:
+    case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE:
       return "DURABLE_STORAGE";
-    case content::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       return "PROTECTED_MEDIA_IDENTIFIER";
-    case content::PermissionType::AUDIO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
       return "AUDIO_CAPTURE";
-    case content::PermissionType::VIDEO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
       return "VIDEO_CAPTURE";
-    case content::PermissionType::MIDI:
-      return "MIDI";
-    case content::PermissionType::BACKGROUND_SYNC:
+    case CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC:
       return "BACKGROUND_SYNC";
-    case content::PermissionType::FLASH:
+    case CONTENT_SETTINGS_TYPE_PLUGINS:
       return "FLASH";
-    case content::PermissionType::NUM:
+    default:
       break;
   }
   NOTREACHED();
   return std::string();
 }
 
-PermissionRequestType PermissionUtil::GetRequestType(
-    content::PermissionType type) {
+PermissionRequestType PermissionUtil::GetRequestType(ContentSettingsType type) {
   switch (type) {
-    case content::PermissionType::GEOLOCATION:
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       return PermissionRequestType::PERMISSION_GEOLOCATION;
-    case content::PermissionType::NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
       return PermissionRequestType::PERMISSION_NOTIFICATIONS;
-    case content::PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       return PermissionRequestType::PERMISSION_MIDI_SYSEX;
-    case content::PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       return PermissionRequestType::PERMISSION_PUSH_MESSAGING;
-    case content::PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       return PermissionRequestType::PERMISSION_PROTECTED_MEDIA_IDENTIFIER;
-    case content::PermissionType::FLASH:
+    case CONTENT_SETTINGS_TYPE_PLUGINS:
       return PermissionRequestType::PERMISSION_FLASH;
     default:
       NOTREACHED();
@@ -119,6 +119,8 @@
     *out = PermissionType::GEOLOCATION;
   } else if (type == CONTENT_SETTINGS_TYPE_NOTIFICATIONS) {
     *out = PermissionType::NOTIFICATIONS;
+  } else if (type == CONTENT_SETTINGS_TYPE_PUSH_MESSAGING) {
+    *out = PermissionType::PUSH_MESSAGING;
   } else if (type == CONTENT_SETTINGS_TYPE_MIDI_SYSEX) {
     *out = PermissionType::MIDI_SYSEX;
   } else if (type == CONTENT_SETTINGS_TYPE_DURABLE_STORAGE) {
@@ -129,6 +131,8 @@
     *out = PermissionType::AUDIO_CAPTURE;
   } else if (type == CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC) {
     *out = PermissionType::BACKGROUND_SYNC;
+  } else if (type == CONTENT_SETTINGS_TYPE_PLUGINS) {
+    *out = PermissionType::FLASH;
 #if defined(OS_ANDROID) || defined(OS_CHROMEOS)
   } else if (type == CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER) {
     *out = PermissionType::PROTECTED_MEDIA_IDENTIFIER;
@@ -192,7 +196,7 @@
   if (final_content_setting != CONTENT_SETTING_ALLOW) {
     PermissionType permission_type;
     if (PermissionUtil::GetPermissionType(content_type_, &permission_type)) {
-      PermissionUmaUtil::PermissionRevoked(permission_type, source_ui_,
+      PermissionUmaUtil::PermissionRevoked(content_type_, source_ui_,
                                            primary_url_, profile_);
     }
   }
diff --git a/chrome/browser/permissions/permission_util.h b/chrome/browser/permissions/permission_util.h
index 2ad0c7ed..b8faf941 100644
--- a/chrome/browser/permissions/permission_util.h
+++ b/chrome/browser/permissions/permission_util.h
@@ -35,34 +35,32 @@
   PERMISSION_ACTION_NUM,
 };
 
-struct PermissionTypeHash {
-  std::size_t operator()(const content::PermissionType& type) const;
-};
-
 // A utility class for permissions.
 class PermissionUtil {
  public:
-  // Returns the permission string for the given PermissionType.
-  static std::string GetPermissionString(content::PermissionType permission);
+  // Returns the permission string for the given permission.
+  static std::string GetPermissionString(ContentSettingsType);
+  // TODO(timloh): Remove this content::PermissionType overload when we add MIDI
+  // to ContentSettingsType.
+  static std::string GetPermissionString(content::PermissionType);
 
-  // Return the stringified version of the PermissionType enum that Safe
-  // Browsing uses for the API Blacklist.
-  static std::string ConvertPermissionTypeToSafeBrowsingName(
-      const content::PermissionType& permission_type);
+  // Return the stringified version of the ContentSettingsType enum that
+  // Safe Browsing uses for the API Blacklist.
+  static std::string ConvertContentSettingsTypeToSafeBrowsingName(
+      ContentSettingsType permission);
 
   // Returns the request type corresponding to a permission type.
-  static PermissionRequestType GetRequestType(content::PermissionType type);
+  static PermissionRequestType GetRequestType(ContentSettingsType permission);
 
   // Returns the gesture type corresponding to whether a permission request is
   // made with or without a user gesture.
   static PermissionRequestGestureType GetGestureType(bool user_gesture);
 
-  // Limited conversion of ContentSettingsType to PermissionType. Intended for
-  // recording Permission UMA metrics from areas of the codebase which have not
-  // yet been converted to PermissionType. Returns true if the conversion was
-  // performed.
-  // TODO(tsergeant): Remove this function once callsites operate on
-  // PermissionType directly.
+  // Limited conversion of ContentSettingsType to PermissionType. Returns true
+  // if the conversion was performed.
+  // TODO(timloh): Try to remove this function. Mainly we need to work out how
+  // to remove the usage in PermissionUmaUtil, which uses PermissionType as a
+  // histogram value to count permission request metrics.
   static bool GetPermissionType(ContentSettingsType type,
                                 content::PermissionType* out);
 
diff --git a/chrome/browser/plugins/flash_download_interception.cc b/chrome/browser/plugins/flash_download_interception.cc
index f46a1e06..aa59db3d 100644
--- a/chrome/browser/plugins/flash_download_interception.cc
+++ b/chrome/browser/plugins/flash_download_interception.cc
@@ -13,11 +13,11 @@
 #include "chrome/browser/plugins/plugins_field_trial.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_features.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/navigation_interception/intercept_navigation_throttle.h"
 #include "components/navigation_interception/navigation_params.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_handle.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/WebKit/public/platform/modules/permissions/permission_status.mojom.h"
 #include "third_party/re2/src/re2/re2.h"
@@ -67,7 +67,7 @@
   if (flash_setting == CONTENT_SETTING_DETECT_IMPORTANT_CONTENT) {
     PermissionManager* manager = PermissionManager::Get(profile);
     manager->RequestPermission(
-        content::PermissionType::FLASH, web_contents->GetMainFrame(),
+        CONTENT_SETTINGS_TYPE_PLUGINS, web_contents->GetMainFrame(),
         web_contents->GetLastCommittedURL(), true, base::Bind(&DoNothing));
   } else if (flash_setting == CONTENT_SETTING_BLOCK) {
     TabSpecificContentSettings::FromWebContents(web_contents)
diff --git a/chrome/browser/plugins/flash_permission_context.cc b/chrome/browser/plugins/flash_permission_context.cc
index 7e7eb93f..0794b45 100644
--- a/chrome/browser/plugins/flash_permission_context.cc
+++ b/chrome/browser/plugins/flash_permission_context.cc
@@ -32,7 +32,6 @@
 
 FlashPermissionContext::FlashPermissionContext(Profile* profile)
     : PermissionContextBase(profile,
-                            content::PermissionType::FLASH,
                             CONTENT_SETTINGS_TYPE_PLUGINS) {}
 
 FlashPermissionContext::~FlashPermissionContext() {}
diff --git a/chrome/browser/plugins/flash_temporary_permission_tracker_unittest.cc b/chrome/browser/plugins/flash_temporary_permission_tracker_unittest.cc
index b1fe835e..b3e01f8d 100644
--- a/chrome/browser/plugins/flash_temporary_permission_tracker_unittest.cc
+++ b/chrome/browser/plugins/flash_temporary_permission_tracker_unittest.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/plugins/flash_temporary_permission_tracker.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_profile.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/test_renderer_host.h"
diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.cc b/chrome/browser/push_messaging/push_messaging_service_impl.cc
index fbc0c0e..f495134 100644
--- a/chrome/browser/push_messaging/push_messaging_service_impl.cc
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.cc
@@ -45,7 +45,6 @@
 #include "components/rappor/public/rappor_utils.h"
 #include "components/rappor/rappor_service_impl.h"
 #include "content/public/browser/browser_context.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/service_worker_context.h"
 #include "content/public/browser/storage_partition.h"
@@ -474,8 +473,8 @@
   }
 
   // Push does not allow permission requests from iframes.
-  profile_->GetPermissionManager()->RequestPermission(
-      content::PermissionType::PUSH_MESSAGING, web_contents->GetMainFrame(),
+  PermissionManager::Get(profile_)->RequestPermission(
+      CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, web_contents->GetMainFrame(),
       requesting_origin, true /* user_gesture */,
       base::Bind(&PushMessagingServiceImpl::DoSubscribe,
                  weak_factory_.GetWeakPtr(), app_identifier, options,
@@ -520,8 +519,8 @@
   // Because the Push API is tied to Service Workers, many usages of the API
   // won't have an embedding origin at all. Only consider the requesting
   // |origin| when checking whether permission to use the API has been granted.
-  return ToPushPermission(profile_->GetPermissionManager()->GetPermissionStatus(
-      content::PermissionType::PUSH_MESSAGING, origin, origin));
+  return ToPushPermission(PermissionManager::Get(profile_)->GetPermissionStatus(
+      CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, origin, origin));
 }
 
 bool PushMessagingServiceImpl::SupportNonVisibleMessages() {
diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.h b/chrome/browser/push_messaging/push_messaging_service_impl.h
index 50416f94..920f44e8 100644
--- a/chrome/browser/push_messaging/push_messaging_service_impl.h
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.h
@@ -20,6 +20,7 @@
 #include "chrome/common/features.h"
 #include "components/content_settings/core/browser/content_settings_observer.h"
 #include "components/content_settings/core/common/content_settings.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/gcm_driver/common/gcm_messages.h"
 #include "components/gcm_driver/gcm_app_handler.h"
 #include "components/gcm_driver/gcm_client.h"
diff --git a/chrome/browser/safe_browsing/permission_reporter.cc b/chrome/browser/safe_browsing/permission_reporter.cc
index 8356864..6af846e6 100644
--- a/chrome/browser/safe_browsing/permission_reporter.cc
+++ b/chrome/browser/safe_browsing/permission_reporter.cc
@@ -12,11 +12,8 @@
 #include "chrome/browser/permissions/permission_request.h"
 #include "chrome/common/safe_browsing/permission_report.pb.h"
 #include "components/variations/active_field_trials.h"
-#include "content/public/browser/permission_type.h"
 #include "net/url_request/report_sender.h"
 
-using content::PermissionType;
-
 namespace safe_browsing {
 
 namespace {
@@ -28,31 +25,29 @@
 const int kMaximumReportsPerOriginPerPermissionPerMinute = 5;
 
 PermissionReport::PermissionType PermissionTypeForReport(
-    PermissionType permission) {
+    ContentSettingsType permission) {
   switch (permission) {
-    case PermissionType::MIDI_SYSEX:
+    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
       return PermissionReport::MIDI_SYSEX;
-    case PermissionType::PUSH_MESSAGING:
+    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
       return PermissionReport::PUSH_MESSAGING;
-    case PermissionType::NOTIFICATIONS:
+    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
       return PermissionReport::NOTIFICATIONS;
-    case PermissionType::GEOLOCATION:
+    case CONTENT_SETTINGS_TYPE_GEOLOCATION:
       return PermissionReport::GEOLOCATION;
-    case PermissionType::PROTECTED_MEDIA_IDENTIFIER:
+    case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
       return PermissionReport::PROTECTED_MEDIA_IDENTIFIER;
-    case PermissionType::MIDI:
-      return PermissionReport::MIDI;
-    case PermissionType::DURABLE_STORAGE:
+    case CONTENT_SETTINGS_TYPE_DURABLE_STORAGE:
       return PermissionReport::DURABLE_STORAGE;
-    case PermissionType::AUDIO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC:
       return PermissionReport::AUDIO_CAPTURE;
-    case PermissionType::VIDEO_CAPTURE:
+    case CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA:
       return PermissionReport::VIDEO_CAPTURE;
-    case PermissionType::BACKGROUND_SYNC:
+    case CONTENT_SETTINGS_TYPE_BACKGROUND_SYNC:
       return PermissionReport::BACKGROUND_SYNC;
-    case PermissionType::FLASH:
+    case CONTENT_SETTINGS_TYPE_PLUGINS:
       return PermissionReport::FLASH;
-    case PermissionType::NUM:
+    default:
       break;
   }
 
@@ -211,7 +206,7 @@
 }
 
 bool PermissionReporter::IsReportThresholdExceeded(
-    content::PermissionType permission,
+    ContentSettingsType permission,
     const GURL& origin) {
   std::queue<base::Time>& log = report_logs_[{permission, origin}];
   base::Time current_time = clock_->Now();
diff --git a/chrome/browser/safe_browsing/permission_reporter.h b/chrome/browser/safe_browsing/permission_reporter.h
index 7fe213ba..e6ae69f 100644
--- a/chrome/browser/safe_browsing/permission_reporter.h
+++ b/chrome/browser/safe_browsing/permission_reporter.h
@@ -11,6 +11,7 @@
 
 #include "base/time/time.h"
 #include "chrome/browser/permissions/permission_uma_util.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "url/gurl.h"
 
 namespace base {
@@ -27,7 +28,7 @@
 struct PermissionAndOrigin {
   bool operator==(const PermissionAndOrigin& other) const;
 
-  content::PermissionType permission;
+  ContentSettingsType permission;
   GURL origin;
 };
 
@@ -71,7 +72,7 @@
 
   // Returns false if the number of reports sent in the last one minute per
   // origin per permission is under a threshold, otherwise true.
-  bool IsReportThresholdExceeded(content::PermissionType permission,
+  bool IsReportThresholdExceeded(ContentSettingsType permission,
                                  const GURL& origin);
 
   std::unique_ptr<net::ReportSender> permission_report_sender_;
diff --git a/chrome/browser/safe_browsing/permission_reporter_unittest.cc b/chrome/browser/safe_browsing/permission_reporter_unittest.cc
index 3910ea8..fd4996d3 100644
--- a/chrome/browser/safe_browsing/permission_reporter_unittest.cc
+++ b/chrome/browser/safe_browsing/permission_reporter_unittest.cc
@@ -13,11 +13,8 @@
 #include "chrome/browser/safe_browsing/mock_permission_report_sender.h"
 #include "chrome/common/safe_browsing/permission_report.pb.h"
 #include "components/variations/active_field_trials.h"
-#include "content/public/browser/permission_type.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using content::PermissionType;
-
 namespace safe_browsing {
 
 namespace {
@@ -31,8 +28,10 @@
 
 const char kDummyOriginOne[] = "http://example.test/";
 const char kDummyOriginTwo[] = "http://example2.test/";
-const PermissionType kDummyPermissionOne = PermissionType::GEOLOCATION;
-const PermissionType kDummyPermissionTwo = PermissionType::NOTIFICATIONS;
+const ContentSettingsType kDummyPermissionOne =
+    CONTENT_SETTINGS_TYPE_GEOLOCATION;
+const ContentSettingsType kDummyPermissionTwo =
+    CONTENT_SETTINGS_TYPE_NOTIFICATIONS;
 const PermissionAction kDummyAction = GRANTED;
 const PermissionSourceUI kDummySourceUI = PermissionSourceUI::PROMPT;
 const PermissionRequestGestureType kDummyGestureType =
@@ -58,7 +57,7 @@
 };
 
 PermissionReportInfo BuildDummyReportInfo(const char* requesting_origin,
-                                          PermissionType permission) {
+                                          ContentSettingsType permission) {
   PermissionReportInfo info(GURL(requesting_origin), permission, kDummyAction,
       kDummySourceUI, kDummyGestureType, kDummyPersistDecision,
       kDummyNumPriorDismissals, kDummyNumPriorIgnores);
diff --git a/chrome/browser/safe_browsing/ping_manager.h b/chrome/browser/safe_browsing/ping_manager.h
index 8f5e1dd..676fedf5 100644
--- a/chrome/browser/safe_browsing/ping_manager.h
+++ b/chrome/browser/safe_browsing/ping_manager.h
@@ -18,7 +18,6 @@
 #include "chrome/browser/safe_browsing/protocol_manager_helper.h"
 #include "components/safe_browsing_db/hit_report.h"
 #include "components/safe_browsing_db/util.h"
-#include "content/public/browser/permission_type.h"
 #include "net/log/net_log_with_source.h"
 #include "net/url_request/url_fetcher_delegate.h"
 #include "url/gurl.h"
diff --git a/chrome/browser/storage/durable_storage_permission_context.cc b/chrome/browser/storage/durable_storage_permission_context.cc
index 97cf41c..c6fd62c 100644
--- a/chrome/browser/storage/durable_storage_permission_context.cc
+++ b/chrome/browser/storage/durable_storage_permission_context.cc
@@ -20,7 +20,6 @@
 #include "components/content_settings/core/browser/website_settings_registry.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_security_policy.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/common/origin_util.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
 #include "url/gurl.h"
@@ -30,7 +29,6 @@
 DurableStoragePermissionContext::DurableStoragePermissionContext(
     Profile* profile)
     : PermissionContextBase(profile,
-                            content::PermissionType::DURABLE_STORAGE,
                             CONTENT_SETTINGS_TYPE_DURABLE_STORAGE) {}
 
 void DurableStoragePermissionContext::DecidePermission(
diff --git a/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_interactive_uitest.mm b/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_interactive_uitest.mm
index 045db28..856036f 100644
--- a/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_interactive_uitest.mm
+++ b/chrome/browser/ui/cocoa/website_settings/permission_bubble_cocoa_interactive_uitest.mm
@@ -79,7 +79,7 @@
     EXPECT_TRUE(test_api_->manager());
 
     test_api_->AddSimpleRequest(browser()->profile(),
-                                content::PermissionType::GEOLOCATION);
+                                CONTENT_SETTINGS_TYPE_GEOLOCATION);
 
     EXPECT_TRUE([browser()->window()->GetNativeWindow() isKeyWindow]);
     test_api_->manager()->DisplayPendingRequests();
diff --git a/chrome/browser/ui/input_method/input_method_engine_base.cc b/chrome/browser/ui/input_method/input_method_engine_base.cc
index e28670bd..b030117 100644
--- a/chrome/browser/ui/input_method/input_method_engine_base.cc
+++ b/chrome/browser/ui/input_method/input_method_engine_base.cc
@@ -362,6 +362,11 @@
   // commitText while the extension is handling key event.
   handling_key_event_ = true;
 
+  if (key_event.IsCommandDown()) {
+    callback.Run(false);
+    return;
+  }
+
   KeyboardEvent ext_event;
   GetExtensionKeyboardEventFromKeyEvent(key_event, &ext_event);
 
diff --git a/chrome/browser/ui/website_settings/website_settings.cc b/chrome/browser/ui/website_settings/website_settings.cc
index 74add62..a8549dd 100644
--- a/chrome/browser/ui/website_settings/website_settings.cc
+++ b/chrome/browser/ui/website_settings/website_settings.cc
@@ -56,7 +56,6 @@
 #include "components/strings/grit/components_strings.h"
 #include "components/url_formatter/elide_url.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/permission_type.h"
 #include "content/public/browser/user_metrics.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/url_constants.h"
diff --git a/chrome/browser/ui/website_settings/website_settings_ui.h b/chrome/browser/ui/website_settings/website_settings_ui.h
index a656ae57..5689d538 100644
--- a/chrome/browser/ui/website_settings/website_settings_ui.h
+++ b/chrome/browser/ui/website_settings/website_settings_ui.h
@@ -13,7 +13,6 @@
 #include "chrome/browser/ui/website_settings/website_settings.h"
 #include "components/content_settings/core/common/content_settings.h"
 #include "components/content_settings/core/common/content_settings_types.h"
-#include "content/public/browser/permission_type.h"
 #include "ui/gfx/native_widget_types.h"
 
 class Profile;
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h
index dd251805..236cee90 100644
--- a/components/content_settings/core/common/content_settings_types.h
+++ b/components/content_settings/core/common/content_settings_types.h
@@ -5,6 +5,8 @@
 #ifndef COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_CONTENT_SETTINGS_TYPES_H_
 #define COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_CONTENT_SETTINGS_TYPES_H_
 
+#include <cstddef>
+
 #include "build/build_config.h"
 
 // A particular type of content to care about.  We give the user various types
@@ -48,8 +50,19 @@
   CONTENT_SETTINGS_TYPE_PERMISSION_AUTOBLOCKER_DATA,
   CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER,
 
+  // This is only here temporarily and will be removed when we further unify
+  // it with notifications, see crbug.com/563297. No prefs data is stored for
+  // this content type, we instead share values with NOTIFICATIONS.
+  CONTENT_SETTINGS_TYPE_PUSH_MESSAGING,
+
   // WARNING: This enum is going to be removed soon. Do not depend on NUM_TYPES.
   CONTENT_SETTINGS_NUM_TYPES_DO_NOT_USE,
 };
 
+struct ContentSettingsTypeHash {
+  std::size_t operator()(ContentSettingsType type) const {
+    return static_cast<std::size_t>(type);
+  }
+};
+
 #endif  // COMPONENTS_CONTENT_SETTINGS_CORE_COMMON_CONTENT_SETTINGS_TYPES_H_
diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerHelper.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerHelper.java
index 0e378e3..0d71fa4 100644
--- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerHelper.java
+++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/AccountManagerHelper.java
@@ -4,16 +4,12 @@
 
 package org.chromium.components.signin;
 
-import android.Manifest;
 import android.accounts.Account;
 import android.accounts.AuthenticatorDescription;
 import android.app.Activity;
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.os.AsyncTask;
-import android.os.Process;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
 import org.chromium.base.Log;
 import org.chromium.base.VisibleForTesting;
@@ -316,12 +312,6 @@
         });
     }
 
-    public boolean hasGetAccountsPermission() {
-        return ApiCompatibilityUtils.checkPermission(mApplicationContext,
-                       Manifest.permission.GET_ACCOUNTS, Process.myPid(), Process.myUid())
-                == PackageManager.PERMISSION_GRANTED;
-    }
-
     /**
      * Invalidates the old token (if non-null/non-empty) and asynchronously generates a new one.
      *
diff --git a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
index 347cb0c..2700cf05 100644
--- a/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
+++ b/components/signin/core/browser/android/java/src/org/chromium/components/signin/SystemAccountManagerDelegate.java
@@ -4,6 +4,7 @@
 
 package org.chromium.components.signin;
 
+import android.Manifest;
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AccountManagerCallback;
@@ -13,14 +14,17 @@
 import android.accounts.OperationCanceledException;
 import android.app.Activity;
 import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.Process;
 import android.os.SystemClock;
 
 import com.google.android.gms.auth.GoogleAuthException;
 import com.google.android.gms.auth.GoogleAuthUtil;
 import com.google.android.gms.auth.GooglePlayServicesAvailabilityException;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Callback;
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
@@ -188,6 +192,8 @@
     }
 
     protected boolean hasGetAccountsPermission() {
-        return AccountManagerHelper.get(mApplicationContext).hasGetAccountsPermission();
+        return ApiCompatibilityUtils.checkPermission(mApplicationContext,
+                       Manifest.permission.GET_ACCOUNTS, Process.myPid(), Process.myUid())
+                == PackageManager.PERMISSION_GRANTED;
     }
 }
diff --git a/gin/isolate_holder.cc b/gin/isolate_holder.cc
index 637b488..caea27e 100644
--- a/gin/isolate_holder.cc
+++ b/gin/isolate_holder.cc
@@ -34,9 +34,7 @@
 IsolateHolder::IsolateHolder(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
     AccessMode access_mode)
-    : IsolateHolder(std::move(task_runner),
-                    AccessMode::kSingleThread,
-                    kAllowAtomicsWait) {}
+    : IsolateHolder(std::move(task_runner), access_mode, kAllowAtomicsWait) {}
 
 IsolateHolder::IsolateHolder(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.h b/ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.h
index 51f41dac..c7e052b 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.h
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.h
@@ -12,10 +12,15 @@
 // Objective-C wrapper for ntp_snippets::Category.
 @interface ContentSuggestionsCategoryWrapper : NSObject<NSCopying>
 
++ (ContentSuggestionsCategoryWrapper*)wrapperWithCategory:
+    (ntp_snippets::Category)category;
+
 - (instancetype)initWithCategory:(ntp_snippets::Category)category
     NS_DESIGNATED_INITIALIZER;
+
 - (instancetype)init NS_UNAVAILABLE;
 
+// The category wrapped by this object.
 - (ntp_snippets::Category)category;
 
 @end
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.mm b/ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.mm
index cc342d5..22678c8 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.mm
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.mm
@@ -18,6 +18,11 @@
 
 @implementation ContentSuggestionsCategoryWrapper
 
++ (ContentSuggestionsCategoryWrapper*)wrapperWithCategory:
+    (ntp_snippets::Category)category {
+  return [[ContentSuggestionsCategoryWrapper alloc] initWithCategory:category];
+}
+
 @synthesize categoryID = _categoryID;
 
 - (instancetype)initWithCategory:(ntp_snippets::Category)category {
@@ -46,7 +51,7 @@
   ContentSuggestionsCategoryWrapper* other =
       base::mac::ObjCCastStrict<ContentSuggestionsCategoryWrapper>(object);
 
-  return self.category == other.category;
+  return [self category] == [other category];
 }
 
 - (NSUInteger)hash {
@@ -57,7 +62,7 @@
 
 - (id)copyWithZone:(nullable NSZone*)zone {
   ContentSuggestionsCategoryWrapper* copy =
-      [[[self class] allocWithZone:zone] initWithCategory:self.category];
+      [[[self class] allocWithZone:zone] initWithCategory:[self category]];
   return copy;
 }
 
diff --git a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
index c87b1631..71ffec5 100644
--- a/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
+++ b/ios/chrome/browser/content_suggestions/content_suggestions_mediator.mm
@@ -4,17 +4,83 @@
 
 #import "ios/chrome/browser/content_suggestions/content_suggestions_mediator.h"
 
+#include "base/mac/bind_objc_block.h"
 #include "base/memory/ptr_util.h"
+#include "base/optional.h"
+#include "base/strings/sys_string_conversions.h"
 #include "components/ntp_snippets/category.h"
 #include "components/ntp_snippets/content_suggestion.h"
+#import "ios/chrome/browser/content_suggestions/content_suggestions_category_wrapper.h"
 #import "ios/chrome/browser/content_suggestions/content_suggestions_service_bridge_observer.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestion.h"
 #import "ios/chrome/browser/ui/content_suggestions/content_suggestions_data_sink.h"
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_item.h"
+#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.h"
+#include "ui/gfx/image/image.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
+namespace {
+
+// Returns the Type for this |category|.
+ContentSuggestionType TypeForCategory(ntp_snippets::Category category) {
+  // For now, only Article is a relevant type.
+  return ContentSuggestionTypeArticle;
+}
+
+// Returns the section ID for this |category|.
+ContentSuggestionsSectionID SectionIDForCategory(
+    ntp_snippets::Category category) {
+  if (category.IsKnownCategory(ntp_snippets::KnownCategories::BOOKMARKS))
+    return ContentSuggestionsSectionBookmarks;
+  if (category.IsKnownCategory(ntp_snippets::KnownCategories::ARTICLES))
+    return ContentSuggestionsSectionArticles;
+
+  return ContentSuggestionsSectionUnknown;
+}
+
+// Returns the section layout corresponding to the category |layout|.
+ContentSuggestionsSectionLayout SectionLayoutForLayout(
+    ntp_snippets::ContentSuggestionsCardLayout layout) {
+  // For now, only cards are relevant.
+  return ContentSuggestionsSectionLayoutCard;
+}
+
+// Converts a ntp_snippets::ContentSuggestion to an Objective-C
+// ContentSuggestion.
+ContentSuggestion* ConvertContentSuggestion(
+    const ntp_snippets::ContentSuggestion& contentSuggestion) {
+  ContentSuggestion* suggestion = [[ContentSuggestion alloc] init];
+  suggestion.title = base::SysUTF16ToNSString(contentSuggestion.title());
+  suggestion.text = base::SysUTF16ToNSString(contentSuggestion.snippet_text());
+  suggestion.url = contentSuggestion.url();
+
+  return suggestion;
+}
+
+// Returns a SectionInformation for a |category|, filled with the
+// |categoryInfo|.
+ContentSuggestionsSectionInformation* SectionInformationFromCategoryInfo(
+    const base::Optional<ntp_snippets::CategoryInfo>& categoryInfo,
+    const ntp_snippets::Category& category) {
+  ContentSuggestionsSectionInformation* sectionInfo =
+      [[ContentSuggestionsSectionInformation alloc]
+          initWithSectionID:SectionIDForCategory(category)];
+  if (categoryInfo) {
+    sectionInfo.layout = SectionLayoutForLayout(categoryInfo->card_layout());
+    if (categoryInfo->show_if_empty()) {
+      // TODO(crbug.com/686728): Creates an item to display information when the
+      // section is empty.
+    }
+    sectionInfo.title = base::SysUTF16ToNSString(categoryInfo->title());
+  }
+  return sectionInfo;
+}
+
+}  // namespace
+
 @interface ContentSuggestionsMediator ()<ContentSuggestionsServiceObserver> {
   // Bridge for this class to become an observer of a ContentSuggestionsService.
   std::unique_ptr<ContentSuggestionsServiceBridge> _suggestionBridge;
@@ -22,15 +88,19 @@
 
 @property(nonatomic, assign)
     ntp_snippets::ContentSuggestionsService* contentService;
+@property(nonatomic, strong, nonnull)
+    NSMutableDictionary<ContentSuggestionsCategoryWrapper*,
+                        ContentSuggestionsSectionInformation*>*
+        sectionInformationByCategory;
 
 // Converts the data in |category| to ContentSuggestion and adds them to the
 // |contentArray|.
 - (void)addContentInCategory:(ntp_snippets::Category&)category
                      toArray:(NSMutableArray<ContentSuggestion*>*)contentArray;
 
-// Converts the |contentsuggestion| to a ContentSuggestion.
-- (ContentSuggestion*)convertContentSuggestion:
-    (const ntp_snippets::ContentSuggestion&)contentsuggestion;
+// Adds the section information for |category| in
+// self.sectionInformationByCategory.
+- (void)addSectionInformationForCategory:(ntp_snippets::Category)category;
 
 @end
 
@@ -38,6 +108,7 @@
 
 @synthesize contentService = _contentService;
 @synthesize dataSink = _dataSink;
+@synthesize sectionInformationByCategory = _sectionInformationByCategory;
 
 - (instancetype)initWithContentService:
     (ntp_snippets::ContentSuggestionsService*)contentService {
@@ -46,6 +117,7 @@
     _suggestionBridge =
         base::MakeUnique<ContentSuggestionsServiceBridge>(self, contentService);
     _contentService = contentService;
+    _sectionInformationByCategory = [[NSMutableDictionary alloc] init];
   }
   return self;
 }
@@ -57,6 +129,14 @@
       self.contentService->GetCategories();
   NSMutableArray<ContentSuggestion*>* dataHolders = [NSMutableArray array];
   for (auto& category : categories) {
+    if (self.contentService->GetCategoryStatus(category) !=
+        ntp_snippets::CategoryStatus::AVAILABLE) {
+      continue;
+    }
+    if (!self.sectionInformationByCategory[
+            [ContentSuggestionsCategoryWrapper wrapperWithCategory:category]]) {
+      [self addSectionInformationForCategory:category];
+    }
     [self addContentInCategory:category toArray:dataHolders];
   }
   return dataHolders;
@@ -100,14 +180,28 @@
                      toArray:(NSMutableArray<ContentSuggestion*>*)contentArray {
   const std::vector<ntp_snippets::ContentSuggestion>& suggestions =
       self.contentService->GetSuggestionsForCategory(category);
+  ContentSuggestionsCategoryWrapper* categoryWrapper =
+      [[ContentSuggestionsCategoryWrapper alloc] initWithCategory:category];
   for (auto& contentSuggestion : suggestions) {
-    [contentArray addObject:[self convertContentSuggestion:contentSuggestion]];
+    ContentSuggestion* suggestion = ConvertContentSuggestion(contentSuggestion);
+    suggestion.type = TypeForCategory(category);
+    suggestion.section = self.sectionInformationByCategory[categoryWrapper];
+
+    // TODO(crbug.com/686728): fetch the image.
+
+    [contentArray addObject:suggestion];
   }
 }
 
-- (ContentSuggestion*)convertContentSuggestion:
-    (const ntp_snippets::ContentSuggestion&)contentsuggestion {
-  return [[ContentSuggestion alloc] init];
+- (void)addSectionInformationForCategory:(ntp_snippets::Category)category {
+  base::Optional<ntp_snippets::CategoryInfo> categoryInfo =
+      self.contentService->GetCategoryInfo(category);
+
+  ContentSuggestionsSectionInformation* sectionInfo =
+      SectionInformationFromCategoryInfo(categoryInfo, category);
+
+  self.sectionInformationByCategory[[ContentSuggestionsCategoryWrapper
+      wrapperWithCategory:category]] = sectionInfo;
 }
 
 @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestion.h b/ios/chrome/browser/ui/content_suggestions/content_suggestion.h
index 68bcf1b..518958eb 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestion.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestion.h
@@ -7,11 +7,32 @@
 
 #import <UIKit/UIKit.h>
 
-// Data for a suggestions item, compatible with Objective-C.
+#include "url/gurl.h"
+
+@class ContentSuggestionsSectionInformation;
+
+// Enum defining the type of a ContentSuggestions.
+typedef NS_ENUM(NSInteger, ContentSuggestionType) {
+  ContentSuggestionTypeArticle
+};
+
+// Data for a suggestions item, compatible with Objective-C. Mostly acts as a
+// wrapper for ntp_snippets::ContentSuggestion.
 @interface ContentSuggestion : NSObject
 
-@property(nonatomic, copy) NSString* title;
-@property(nonatomic, strong) UIImage* image;
+// Title of the suggestion.
+@property(nonatomic, copy, nullable) NSString* title;
+// Text for the suggestion.
+@property(nonatomic, copy, nullable) NSString* text;
+// Image for the suggestion.
+@property(nonatomic, strong, nullable) UIImage* image;
+// URL associated with the suggestion.
+@property(nonatomic, assign) GURL url;
+
+// Section information in which this suggestion should be.
+@property(nonatomic, strong, nullable)
+    ContentSuggestionsSectionInformation* section;
+@property(nonatomic, assign) ContentSuggestionType type;
 
 @end
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestion.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestion.mm
index 0d25178..b9877af 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestion.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestion.mm
@@ -12,5 +12,9 @@
 
 @synthesize title = _title;
 @synthesize image = _image;
+@synthesize text = _text;
+@synthesize url = _url;
+@synthesize section = _section;
+@synthesize type = _type;
 
 @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.mm
index 5a7bc868..1c73e5fa 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_article_item.mm
@@ -22,6 +22,8 @@
 
 @end
 
+#pragma mark - ContentSuggestionsArticleItem
+
 @implementation ContentSuggestionsArticleItem
 
 @synthesize title = _title;
@@ -54,6 +56,8 @@
 
 @end
 
+#pragma mark - ContentSuggestionsArticleCell
+
 @implementation ContentSuggestionsArticleCell
 
 @synthesize titleLabel = _titleLabel;
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.h
index 92545c1..2a0f2ca 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.h
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.h
@@ -27,27 +27,25 @@
 
   // Do not use this. It will trigger a DCHECK.
   // Do not add value after this one.
-  ContentSuggestionsSectionCount
+  ContentSuggestionsSectionUnknown
 };
 
 // Contains the information needed to display the section.
 @interface ContentSuggestionsSectionInformation : NSObject
 
-- (instancetype)initWithID:(ContentSuggestionsSectionID)ID
-                 emptyCell:(CollectionViewItem*)emptyCell
-                    layout:(ContentSuggestionsSectionLayout)layout
-                     title:(NSString*)title NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithSectionID:(ContentSuggestionsSectionID)sectionID
+    NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
 
 // Item to display when the section is empty. If nil the section should not be
 // displayed when empty.
-@property(nonatomic, strong, readonly) CollectionViewItem* emptyCell;
+@property(nonatomic, strong) CollectionViewItem* emptyCell;
 // Layout to display the content of the section.
-@property(nonatomic, assign, readonly) ContentSuggestionsSectionLayout layout;
+@property(nonatomic, assign) ContentSuggestionsSectionLayout layout;
 // ID of the section. Used for ordering.
-@property(nonatomic, assign, readonly) ContentSuggestionsSectionID ID;
+@property(nonatomic, assign, readonly) ContentSuggestionsSectionID sectionID;
 // Title for the section.
-@property(nonatomic, copy, readonly) NSString* title;
+@property(nonatomic, copy) NSString* title;
 
 @end
 
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.mm
index 85969aab..817f8aa 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_section_information.mm
@@ -14,20 +14,14 @@
 
 @synthesize emptyCell = _emptyCell;
 @synthesize layout = _layout;
-@synthesize ID = _ID;
+@synthesize sectionID = _sectionID;
 @synthesize title = _title;
 
-- (instancetype)initWithID:(ContentSuggestionsSectionID)ID
-                 emptyCell:(CollectionViewItem*)emptyCell
-                    layout:(ContentSuggestionsSectionLayout)layout
-                     title:(NSString*)title {
+- (instancetype)initWithSectionID:(ContentSuggestionsSectionID)sectionID {
   self = [super init];
   if (self) {
-    DCHECK(ID < ContentSuggestionsSectionCount);
-    _ID = ID;
-    _layout = layout;
-    _emptyCell = emptyCell;
-    _title = [title copy];
+    DCHECK(sectionID < ContentSuggestionsSectionUnknown);
+    _sectionID = sectionID;
   }
   return self;
 }
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index 9ef544c..3e95bbf 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -211,7 +211,7 @@
     }
   }
 
-  if (is_chromeos || is_mac || is_win) {
+  if (is_chromeos || is_win) {
     sources += [
       "accelerated_video_decoder.h",
       "h264_decoder.cc",
diff --git a/media/gpu/h264_decoder.cc b/media/gpu/h264_decoder.cc
index 7f4b7e2..e811217 100644
--- a/media/gpu/h264_decoder.cc
+++ b/media/gpu/h264_decoder.cc
@@ -110,10 +110,54 @@
 }
 
 bool H264Decoder::InitCurrPicture(const H264SliceHeader* slice_hdr) {
-  curr_pic_ = CreateH264PictureFromSliceHeader(parser_.GetSPS(curr_sps_id_),
-                                               *slice_hdr);
-  if (!curr_pic_)
+  DCHECK(curr_pic_.get());
+
+  curr_pic_->idr = slice_hdr->idr_pic_flag;
+  if (curr_pic_->idr)
+    curr_pic_->idr_pic_id = slice_hdr->idr_pic_id;
+
+  if (slice_hdr->field_pic_flag) {
+    curr_pic_->field = slice_hdr->bottom_field_flag ? H264Picture::FIELD_BOTTOM
+                                                    : H264Picture::FIELD_TOP;
+  } else {
+    curr_pic_->field = H264Picture::FIELD_NONE;
+  }
+
+  if (curr_pic_->field != H264Picture::FIELD_NONE) {
+    DVLOG(1) << "Interlaced video not supported.";
     return false;
+  }
+
+  curr_pic_->nal_ref_idc = slice_hdr->nal_ref_idc;
+  curr_pic_->ref = slice_hdr->nal_ref_idc != 0;
+  // This assumes non-interlaced stream.
+  curr_pic_->frame_num = curr_pic_->pic_num = slice_hdr->frame_num;
+
+  DCHECK_NE(curr_sps_id_, -1);
+  const H264SPS* sps = parser_.GetSPS(curr_sps_id_);
+  if (!sps)
+    return false;
+
+  curr_pic_->pic_order_cnt_type = sps->pic_order_cnt_type;
+  switch (curr_pic_->pic_order_cnt_type) {
+    case 0:
+      curr_pic_->pic_order_cnt_lsb = slice_hdr->pic_order_cnt_lsb;
+      curr_pic_->delta_pic_order_cnt_bottom =
+          slice_hdr->delta_pic_order_cnt_bottom;
+      break;
+
+    case 1:
+      curr_pic_->delta_pic_order_cnt0 = slice_hdr->delta_pic_order_cnt0;
+      curr_pic_->delta_pic_order_cnt1 = slice_hdr->delta_pic_order_cnt1;
+      break;
+
+    case 2:
+      break;
+
+    default:
+      NOTREACHED();
+      return false;
+  }
 
   if (!CalculatePicOrderCounts(curr_pic_))
     return false;
@@ -1136,12 +1180,53 @@
   return true;
 }
 
+bool H264Decoder::IsNewPrimaryCodedPicture(
+    const H264SliceHeader* slice_hdr) const {
+  if (!curr_pic_)
+    return true;
+
+  // 7.4.1.2.4, assumes non-interlaced.
+  if (slice_hdr->frame_num != curr_pic_->frame_num ||
+      slice_hdr->pic_parameter_set_id != curr_pps_id_ ||
+      slice_hdr->nal_ref_idc != curr_pic_->nal_ref_idc ||
+      slice_hdr->idr_pic_flag != curr_pic_->idr ||
+      (slice_hdr->idr_pic_flag &&
+       (slice_hdr->idr_pic_id != curr_pic_->idr_pic_id ||
+        // If we have two consecutive IDR slices, and the second one has
+        // first_mb_in_slice == 0, treat it as a new picture.
+        // Per spec, idr_pic_id should not be equal in this case (and we should
+        // have hit the condition above instead, see spec 7.4.3 on idr_pic_id),
+        // but some encoders neglect changing idr_pic_id for two consecutive
+        // IDRs. Work around this by checking if the next slice contains the
+        // zeroth macroblock, i.e. data that belongs to the next picture.
+        slice_hdr->first_mb_in_slice == 0)))
+    return true;
+
+  const H264SPS* sps = parser_.GetSPS(curr_sps_id_);
+  if (!sps)
+    return false;
+
+  if (sps->pic_order_cnt_type == curr_pic_->pic_order_cnt_type) {
+    if (curr_pic_->pic_order_cnt_type == 0) {
+      if (slice_hdr->pic_order_cnt_lsb != curr_pic_->pic_order_cnt_lsb ||
+          slice_hdr->delta_pic_order_cnt_bottom !=
+              curr_pic_->delta_pic_order_cnt_bottom)
+        return true;
+    } else if (curr_pic_->pic_order_cnt_type == 1) {
+      if (slice_hdr->delta_pic_order_cnt0 != curr_pic_->delta_pic_order_cnt0 ||
+          slice_hdr->delta_pic_order_cnt1 != curr_pic_->delta_pic_order_cnt1)
+        return true;
+    }
+  }
+
+  return false;
+}
+
 bool H264Decoder::PreprocessCurrentSlice() {
   const H264SliceHeader* slice_hdr = curr_slice_hdr_.get();
   DCHECK(slice_hdr);
 
-  if (IsNewPrimaryCodedPicture(curr_pic_, curr_pps_id_,
-                               parser_.GetSPS(curr_sps_id_), *slice_hdr)) {
+  if (IsNewPrimaryCodedPicture(slice_hdr)) {
     // New picture, so first finish the previous one before processing it.
     if (!FinishPrevFrameIfPresent())
       return false;
@@ -1354,99 +1439,4 @@
   return dpb_.max_num_pics() + kPicsInPipeline;
 }
 
-// static
-scoped_refptr<H264Picture> H264Decoder::CreateH264PictureFromSliceHeader(
-    const H264SPS* sps,
-    const H264SliceHeader& slice_hdr) {
-  scoped_refptr<H264Picture> pic(new H264Picture());
-  pic->idr = slice_hdr.idr_pic_flag;
-  if (pic->idr)
-    pic->idr_pic_id = slice_hdr.idr_pic_id;
-
-  if (slice_hdr.field_pic_flag) {
-    pic->field = slice_hdr.bottom_field_flag ? H264Picture::FIELD_BOTTOM
-                                             : H264Picture::FIELD_TOP;
-  } else {
-    pic->field = H264Picture::FIELD_NONE;
-  }
-
-  if (pic->field != H264Picture::FIELD_NONE) {
-    DVLOG(1) << "Interlaced video not supported.";
-    return nullptr;
-  }
-
-  pic->nal_ref_idc = slice_hdr.nal_ref_idc;
-  pic->ref = slice_hdr.nal_ref_idc != 0;
-  // This assumes non-interlaced stream.
-  pic->frame_num = pic->pic_num = slice_hdr.frame_num;
-
-  if (!sps)
-    return nullptr;
-
-  pic->pic_order_cnt_type = sps->pic_order_cnt_type;
-  switch (pic->pic_order_cnt_type) {
-    case 0:
-      pic->pic_order_cnt_lsb = slice_hdr.pic_order_cnt_lsb;
-      pic->delta_pic_order_cnt_bottom = slice_hdr.delta_pic_order_cnt_bottom;
-      break;
-
-    case 1:
-      pic->delta_pic_order_cnt0 = slice_hdr.delta_pic_order_cnt0;
-      pic->delta_pic_order_cnt1 = slice_hdr.delta_pic_order_cnt1;
-      break;
-
-    case 2:
-      break;
-
-    default:
-      NOTREACHED();
-      return nullptr;
-  }
-  return pic;
-}
-
-// static
-bool H264Decoder::IsNewPrimaryCodedPicture(scoped_refptr<H264Picture> curr_pic,
-                                           int curr_pps_id,
-                                           const H264SPS* sps,
-                                           const H264SliceHeader& slice_hdr) {
-  if (!curr_pic)
-    return true;
-
-  // 7.4.1.2.4, assumes non-interlaced.
-  if (slice_hdr.frame_num != curr_pic->frame_num ||
-      slice_hdr.pic_parameter_set_id != curr_pps_id ||
-      slice_hdr.nal_ref_idc != curr_pic->nal_ref_idc ||
-      slice_hdr.idr_pic_flag != curr_pic->idr ||
-      (slice_hdr.idr_pic_flag &&
-       (slice_hdr.idr_pic_id != curr_pic->idr_pic_id ||
-        // If we have two consecutive IDR slices, and the second one has
-        // first_mb_in_slice == 0, treat it as a new picture.
-        // Per spec, idr_pic_id should not be equal in this case (and we should
-        // have hit the condition above instead, see spec 7.4.3 on idr_pic_id),
-        // but some encoders neglect changing idr_pic_id for two consecutive
-        // IDRs. Work around this by checking if the next slice contains the
-        // zeroth macroblock, i.e. data that belongs to the next picture.
-        slice_hdr.first_mb_in_slice == 0)))
-    return true;
-
-  if (!sps)
-    return false;
-
-  if (sps->pic_order_cnt_type == curr_pic->pic_order_cnt_type) {
-    if (curr_pic->pic_order_cnt_type == 0) {
-      if (slice_hdr.pic_order_cnt_lsb != curr_pic->pic_order_cnt_lsb ||
-          slice_hdr.delta_pic_order_cnt_bottom !=
-              curr_pic->delta_pic_order_cnt_bottom)
-        return true;
-    } else if (curr_pic->pic_order_cnt_type == 1) {
-      if (slice_hdr.delta_pic_order_cnt0 != curr_pic->delta_pic_order_cnt0 ||
-          slice_hdr.delta_pic_order_cnt1 != curr_pic->delta_pic_order_cnt1)
-        return true;
-    }
-  }
-
-  return false;
-}
-
 }  // namespace media
diff --git a/media/gpu/h264_decoder.h b/media/gpu/h264_decoder.h
index 7db95f7..1caf662 100644
--- a/media/gpu/h264_decoder.h
+++ b/media/gpu/h264_decoder.h
@@ -111,18 +111,6 @@
   gfx::Size GetPicSize() const override;
   size_t GetRequiredNumOfPictures() const override;
 
-  // Return true if we need to start a new picture.
-  static bool IsNewPrimaryCodedPicture(scoped_refptr<H264Picture> curr_pic,
-                                       int curr_pps_id,
-                                       const H264SPS* sps,
-                                       const H264SliceHeader& slice_hdr);
-
-  // Create a H264Picture from given params. Return nullptr when there is an
-  // error.
-  static scoped_refptr<H264Picture> CreateH264PictureFromSliceHeader(
-      const H264SPS* sps,
-      const H264SliceHeader& slice_hdr);
-
  private:
   // We need to keep at most kDPBMaxSize pictures in DPB for
   // reference/to display later and an additional one for the one currently
@@ -151,6 +139,9 @@
   // Process current slice as a slice of the current picture.
   bool ProcessCurrentSlice();
 
+  // Return true if we need to start a new picture.
+  bool IsNewPrimaryCodedPicture(const H264SliceHeader* slice_hdr) const;
+
   // Initialize the current picture according to data in |slice_hdr|.
   bool InitCurrPicture(const H264SliceHeader* slice_hdr);
 
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc
index 7f925a6..11f019b9 100644
--- a/media/gpu/video_encode_accelerator_unittest.cc
+++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -46,8 +46,6 @@
 #include "media/filters/ffmpeg_video_decoder.h"
 #include "media/filters/h264_parser.h"
 #include "media/filters/ivf_parser.h"
-#include "media/gpu/h264_decoder.h"
-#include "media/gpu/h264_dpb.h"
 #include "media/gpu/video_accelerator_unittest_helpers.h"
 #include "media/video/fake_video_encode_accelerator.h"
 #include "media/video/video_encode_accelerator.h"
@@ -607,18 +605,11 @@
   void ProcessStreamBuffer(const uint8_t* stream, size_t size) override;
 
  private:
-  bool IsNewPicture(const H264SliceHeader& slice_hdr);
-  bool UpdateCurrentPicture(const H264SliceHeader& slice_hdr);
-
   // Set to true when encoder provides us with the corresponding NALU type.
   bool seen_sps_;
   bool seen_pps_;
   bool seen_idr_;
 
-  scoped_refptr<H264Picture> curr_pic_;
-  int curr_sps_id_ = -1;
-  int curr_pps_id_ = -1;
-
   H264Parser h264_parser_;
 };
 
@@ -646,14 +637,9 @@
       // fallthrough
       case H264NALU::kNonIDRSlice: {
         ASSERT_TRUE(seen_idr_);
-        H264SliceHeader slice_hdr;
-        ASSERT_EQ(H264Parser::kOk,
-                  h264_parser_.ParseSliceHeader(nalu, &slice_hdr));
-        if (IsNewPicture(slice_hdr)) {
-          if (!frame_cb_.Run(keyframe))
-            return;
-          ASSERT_TRUE(UpdateCurrentPicture(slice_hdr));
-        }
+        seen_sps_ = seen_pps_ = false;
+        if (!frame_cb_.Run(keyframe))
+          return;
         break;
       }
 
@@ -678,36 +664,6 @@
   }
 }
 
-bool H264Validator::IsNewPicture(const H264SliceHeader& slice_hdr) {
-  if (!curr_pic_)
-    return true;
-  return H264Decoder::IsNewPrimaryCodedPicture(
-      curr_pic_, curr_pps_id_, h264_parser_.GetSPS(curr_sps_id_), slice_hdr);
-}
-
-bool H264Validator::UpdateCurrentPicture(const H264SliceHeader& slice_hdr) {
-  curr_pps_id_ = slice_hdr.pic_parameter_set_id;
-  const H264PPS* pps = h264_parser_.GetPPS(curr_pps_id_);
-  if (!pps) {
-    LOG(ERROR) << "Cannot parse pps.";
-    return false;
-  }
-
-  curr_sps_id_ = pps->seq_parameter_set_id;
-  const H264SPS* sps = h264_parser_.GetSPS(curr_sps_id_);
-  if (!sps) {
-    LOG(ERROR) << "Cannot parse sps.";
-    return false;
-  }
-
-  curr_pic_ = H264Decoder::CreateH264PictureFromSliceHeader(sps, slice_hdr);
-  if (!curr_pic_) {
-    LOG(FATAL) << "Cannot initialize current frame.";
-    return false;
-  }
-  return true;
-}
-
 class VP8Validator : public StreamValidator {
  public:
   explicit VP8Validator(const FrameFoundCallback& frame_cb)
@@ -2277,13 +2233,6 @@
                                                           false,
                                                           false,
                                                           false)));
-
-INSTANTIATE_TEST_CASE_P(
-    VerifyTimestamp,
-    VideoEncodeAcceleratorTest,
-    ::testing::Values(
-        std::make_tuple(1, false, 0, false, false, false, false, false, true)));
-
 #if defined(OS_WIN)
 INSTANTIATE_TEST_CASE_P(
     ForceBitrate,
diff --git a/third_party/WebKit/LayoutTests/editing/editability/empty-document-stylewithcss-expected.txt b/third_party/WebKit/LayoutTests/editing/editability/empty-document-stylewithcss-expected.txt
index 3a7468c..45d240de 100644
--- a/third_party/WebKit/LayoutTests/editing/editability/empty-document-stylewithcss-expected.txt
+++ b/third_party/WebKit/LayoutTests/editing/editability/empty-document-stylewithcss-expected.txt
@@ -1,4 +1,5 @@
 CONSOLE WARNING: line 14: document.execCommand() doesn't work with an invalid HTML structure. It is corrected automatically.
+CONSOLE WARNING: line 18: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE WARNING: line 21: document.execCommand() doesn't work with an invalid HTML structure. It is corrected automatically.
 This test ensures WebKit executes StyleWithCSS properly even in an empty document.
 First negation:PASS
diff --git a/third_party/WebKit/LayoutTests/editing/selection/addRange-failures-expected.txt b/third_party/WebKit/LayoutTests/editing/selection/addRange-failures-expected.txt
index 8e11321..a5809d6a 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/addRange-failures-expected.txt
+++ b/third_party/WebKit/LayoutTests/editing/selection/addRange-failures-expected.txt
@@ -1,6 +1,4 @@
-CONSOLE ERROR: line 21: Discontiguous selection is not supported.
 CONSOLE ERROR: line 29: The given range isn't in document.
-CONSOLE ERROR: line 51: The given range and the current selection belong to two different document fragments.
 Test error handling of Selection.addRange().
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/editing/selection/addRange-merging-expected.txt b/third_party/WebKit/LayoutTests/editing/selection/addRange-merging-expected.txt
deleted file mode 100644
index 3c6a0218..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/addRange-merging-expected.txt
+++ /dev/null
@@ -1,270 +0,0 @@
-CONSOLE WARNING: line 83: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 132: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 139: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 146: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-CONSOLE ERROR: line 153: Discontiguous selection is not supported.
-Selection.addRange() should properly merge intersecting (and don't merge discrete) ranges.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-Running: testExpandLeftToRight (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 4)
-Running: testExpandLeftToRight (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 4)
-Running: testExpandLeftToRight (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 4)
-Running: testExpandLeftToRight (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 4)
-Running: testExpandLeftToRight (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #e], 0)
-Running: testExpandLeftToRight (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #e], 0)
-Running: testExpandLeftToRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #c], 0)
-Running: testExpandLeftToRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #c], 0)
-Running: testExpandLeftToRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<DIV>: #container], 1)
-Running: testExpandLeftToRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<DIV>: #container], 1)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 4)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 4)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 4)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 4)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #e], 0)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #e], 0)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #c], 0)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #c], 0)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<DIV>: #container], 1)
-Running: testExpandRightToLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<DIV>: #container], 1)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 2), end = ([Text: 12345], 4)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 2), end = ([Text: 12345], 4)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 2), end = ([<DIV>: #container], 4)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 2), end = ([<DIV>: #container], 4)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #e], 0)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #e], 0)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #a], 0), end = ([<SPAN>: #c], 0)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #a], 0), end = ([<SPAN>: #c], 0)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 1), end = ([<DIV>: #container], 1)
-Running: testExpandLeftToRightAdjacent (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 1), end = ([<DIV>: #container], 1)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 3)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 3)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 3)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 3)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #d], 0)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #d], 0)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #b], 0)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #b], 0)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #a], 1)
-Running: testExpandRightToLeftAdjacent (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #a], 1)
-Running: testExpandBothEnds (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 4)
-Running: testExpandBothEnds (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 4)
-Running: testExpandBothEnds (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 4)
-Running: testExpandBothEnds (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 4)
-Running: testExpandBothEnds (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #e], 0)
-Running: testExpandBothEnds (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #e], 0)
-Running: testExpandBothEnds (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #c], 0)
-Running: testExpandBothEnds (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #c], 0)
-Running: testExpandBothEnds (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<DIV>: #container], 1)
-Running: testExpandBothEnds (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<DIV>: #container], 1)
-Running: testDontExpand (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 4)
-Running: testDontExpand (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 4)
-Running: testDontExpand (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 4)
-Running: testDontExpand (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 4)
-Running: testDontExpand (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #e], 0)
-Running: testDontExpand (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #e], 0)
-Running: testDontExpand (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #c], 0)
-Running: testDontExpand (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #c], 0)
-Running: testDontExpand (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<DIV>: #container], 1)
-Running: testDontExpand (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<DIV>: #container], 1)
-Running: testAddSameRange (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 2), end = ([Text: 12345], 3)
-Running: testAddSameRange (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 2), end = ([Text: 12345], 3)
-Running: testAddSameRange (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 2), end = ([<DIV>: #container], 3)
-Running: testAddSameRange (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 2), end = ([<DIV>: #container], 3)
-Running: testAddSameRange (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #d], 0)
-Running: testAddSameRange (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #d], 0)
-Running: testAddSameRange (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #a], 0), end = ([<SPAN>: #b], 0)
-Running: testAddSameRange (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #a], 0), end = ([<SPAN>: #b], 0)
-Running: testAddSameRange (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 1), end = ([<SPAN>: #a], 1)
-Running: testAddSameRange (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 1), end = ([<SPAN>: #a], 1)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 2)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 2)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 2)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 2)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #c], 0)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #c], 0)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #a], 0)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #a], 0)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #b], 1)
-Running: testRejectDistantRangeAtRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #b], 1)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 3), end = ([Text: 12345], 4)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 3), end = ([Text: 12345], 4)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 3), end = ([<DIV>: #container], 4)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 3), end = ([<DIV>: #container], 4)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #d], 0), end = ([<SPAN>: #e], 0)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #d], 0), end = ([<SPAN>: #e], 0)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #c], 0)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #c], 0)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #a], 1), end = ([<DIV>: #container], 1)
-Running: testRejectDistantRangeAtLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #a], 1), end = ([<DIV>: #container], 1)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 2)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 1), end = ([Text: 12345], 2)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 2)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 1), end = ([<DIV>: #container], 2)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #c], 0)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #c], 0)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #a], 0)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 0), end = ([<SPAN>: #a], 0)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #b], 1)
-Running: testRejectDistantCollapsedRangeAtRight (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #c], 0), end = ([<SPAN>: #b], 1)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeTextPositions, containerIsEditable = false)
-PASS Selection was: start = ([Text: 12345], 3), end = ([Text: 12345], 4)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeTextPositions, containerIsEditable = true)
-PASS Selection was: start = ([Text: 12345], 3), end = ([Text: 12345], 4)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<DIV>: #container], 3), end = ([<DIV>: #container], 4)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeOuterElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<DIV>: #container], 3), end = ([<DIV>: #container], 4)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #d], 0), end = ([<SPAN>: #e], 0)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeInnerElementPositions, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #d], 0), end = ([<SPAN>: #e], 0)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #c], 0)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsBeforeNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #b], 0), end = ([<SPAN>: #c], 0)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = false)
-PASS Selection was: start = ([<SPAN>: #a], 1), end = ([<DIV>: #container], 1)
-Running: testRejectDistantCollapsedRangeAtLeft (initializePositionsFunction = initializeVisiblyEquivalentPositionsAfterNodes, containerIsEditable = true)
-PASS Selection was: start = ([<SPAN>: #a], 1), end = ([<DIV>: #container], 1)
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/third_party/WebKit/LayoutTests/editing/selection/addRange-merging.html b/third_party/WebKit/LayoutTests/editing/selection/addRange-merging.html
deleted file mode 100644
index a4db81c8..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/addRange-merging.html
+++ /dev/null
@@ -1,224 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<title>Range merging with Selection.addRange()</title>
-<script src="../../resources/js-test.js"></script>
-</head>
-<body>
-<script>
-description('Selection.addRange() should properly merge intersecting (and don\'t merge discrete) ranges.');
-
-var selection = window.getSelection();
-
-// Utility functions:
-function createPosition(container, offset)
-{
-    return {'container': container, 'offset': offset};
-}
-
-function createRange(startPosition, endPosition)
-{
-    var range = new Range();
-    range.setStart(startPosition.container, startPosition.offset);
-    range.setEnd(endPosition.container, endPosition.offset);
-    return range;
-}
-
-function nodeToString(node)
-{
-    switch (node.nodeType) {
-    case Node.ELEMENT_NODE:
-        return '[<' + node.tagName + '>: #' + node.id + ']';
-    case Node.TEXT_NODE:
-        return '[Text: ' + node.data + ']';
-    default:
-        return node.toString();
-    }
-}
-
-function positionToString(position)
-{
-    return '(' + nodeToString(position.container) + ', ' + position.offset + ')';
-}
-
-function selectionShouldBe(expectedStartPosition, expectedEndPosition)
-{
-    var range = selection.getRangeAt(0);
-    var actualStartPosition = createPosition(range.startContainer, range.startOffset);
-    var actualEndPosition = createPosition(range.endContainer, range.endOffset);
-    if (actualStartPosition.container === expectedStartPosition.container
-        && actualStartPosition.offset === expectedStartPosition.offset
-        && actualEndPosition.container === expectedEndPosition.container
-        && actualEndPosition.offset === expectedEndPosition.offset) {
-        testPassed('Selection was: start = ' + positionToString(expectedStartPosition) + ', end = ' + positionToString(expectedEndPosition));
-    } else {
-        testFailed('Selection should be: start = ' + positionToString(expectedStartPosition) + ', end = ' + positionToString(expectedEndPosition) + '\nbut was: start = ' + positionToString(actualStartPosition) + ', end = ' + positionToString(actualEndPosition));
-    }
-}
-
-function runSingleTest(testFunction, initializePositionsFunction, containerIsEditable)
-{
-    selection.removeAllRanges();
-    var container = document.createElement('div');
-    container.id = 'container';
-    if (containerIsEditable)
-        container.contentEditable = true;
-    document.body.appendChild(container);
-    var positions = initializePositionsFunction(container);
-    debug('Running: ' + testFunction.name + ' (initializePositionsFunction = ' + initializePositionsFunction.name + ', containerIsEditable = ' + containerIsEditable + ')');
-    testFunction(positions);
-    document.body.removeChild(container);
-}
-
-// Actual tests:
-
-// To have better coverage over the possible code paths, each test is parametarized over four document positions;
-// these positions are guaranteed to be ordered in the document order, but each position may vary in each test run.
-//
-// You can assume the selection is cleared before each test run.
-
-function testExpandLeftToRight(positions)
-{
-    selection.addRange(createRange(positions[0], positions[2]));
-    selection.addRange(createRange(positions[1], positions[3]));
-    selectionShouldBe(positions[0], positions[3]);
-}
-
-function testExpandRightToLeft(positions)
-{
-    selection.addRange(createRange(positions[1], positions[3]));
-    selection.addRange(createRange(positions[0], positions[2]));
-    selectionShouldBe(positions[0], positions[3]);
-}
-
-function testExpandLeftToRightAdjacent(positions)
-{
-    selection.addRange(createRange(positions[1], positions[2]));
-    selection.addRange(createRange(positions[2], positions[3]));
-    selectionShouldBe(positions[1], positions[3]);
-}
-
-function testExpandRightToLeftAdjacent(positions)
-{
-    selection.addRange(createRange(positions[1], positions[2]));
-    selection.addRange(createRange(positions[0], positions[1]));
-    selectionShouldBe(positions[0], positions[2]);
-}
-
-function testExpandBothEnds(positions)
-{
-    selection.addRange(createRange(positions[1], positions[2]));
-    selection.addRange(createRange(positions[0], positions[3]));
-    selectionShouldBe(positions[0], positions[3]);
-}
-
-function testDontExpand(positions)
-{
-    selection.addRange(createRange(positions[0], positions[3]));
-    selection.addRange(createRange(positions[1], positions[2]));
-    selectionShouldBe(positions[0], positions[3]);
-}
-
-function testAddSameRange(positions)
-{
-    selection.addRange(createRange(positions[1], positions[2]));
-    selection.addRange(createRange(positions[1], positions[2]));
-    selectionShouldBe(positions[1], positions[2]);
-}
-
-function testRejectDistantRangeAtRight(positions)
-{
-    selection.addRange(createRange(positions[0], positions[1]));
-    selection.addRange(createRange(positions[2], positions[3]));
-    selectionShouldBe(positions[0], positions[1]);
-}
-
-function testRejectDistantRangeAtLeft(positions)
-{
-    selection.addRange(createRange(positions[2], positions[3]));
-    selection.addRange(createRange(positions[0], positions[1]));
-    selectionShouldBe(positions[2], positions[3]);
-}
-
-function testRejectDistantCollapsedRangeAtRight(positions)
-{
-    selection.addRange(createRange(positions[0], positions[1]));
-    selection.addRange(createRange(positions[2], positions[2]));
-    selectionShouldBe(positions[0], positions[1]);
-}
-
-function testRejectDistantCollapsedRangeAtLeft(positions)
-{
-    selection.addRange(createRange(positions[2], positions[3]));
-    selection.addRange(createRange(positions[1], positions[1]));
-    selectionShouldBe(positions[2], positions[3]);
-}
-
-// Position initializers:
-
-// Each initializer function takes an argument |container| which denotes the root element which can be filled with
-// arbitrary contents. This element is created and added to the document before each test run, and removed from
-// the document after each test run.
-
-function initializeTextPositions(container)
-{
-    container.innerHTML = '12345';
-    var text = container.firstChild;
-    return [createPosition(text, 1), createPosition(text, 2), createPosition(text, 3), createPosition(text, 4)];
-}
-
-function initializeOuterElementPositions(container)
-{
-    container.innerHTML = '<span id="a">1</span><span id="b">2</span><span id="c">3</span><span id="d">4</span><span id="e">5</span>';
-    return [createPosition(container, 1), createPosition(container, 2), createPosition(container, 3), createPosition(container, 4)];
-}
-
-function initializeInnerElementPositions(container)
-{
-    container.innerHTML = '<span id="a">1</span><span id="b">2</span><span id="c">3</span><span id="d">4</span><span id="e">5</span>';
-    return [createPosition(container.childNodes[1], 0), createPosition(container.childNodes[2], 0), createPosition(container.childNodes[3], 0), createPosition(container.childNodes[4], 0)];
-}
-
-function initializeVisiblyEquivalentPositionsBeforeNodes(container)
-{
-    container.innerHTML = '<span id="a"><span id="b"><span id="c"></span></span></span>';
-    return [createPosition(container, 0), createPosition(container.firstChild, 0), createPosition(container.firstChild.firstChild, 0), createPosition(container.firstChild.firstChild.firstChild, 0)];
-}
-
-function initializeVisiblyEquivalentPositionsAfterNodes(container)
-{
-    container.innerHTML = '<span id="a"><span id="b"><span id="c"></span></span></span>';
-    return [createPosition(container.firstChild.firstChild.firstChild, 0), createPosition(container.firstChild.firstChild, 1), createPosition(container.firstChild, 1), createPosition(container, 1)];
-}
-
-var tests = [
-    testExpandLeftToRight,
-    testExpandRightToLeft,
-    testExpandLeftToRightAdjacent,
-    testExpandRightToLeftAdjacent,
-    testExpandBothEnds,
-    testDontExpand,
-    testAddSameRange,
-    testRejectDistantRangeAtRight,
-    testRejectDistantRangeAtLeft,
-    testRejectDistantCollapsedRangeAtRight,
-    testRejectDistantCollapsedRangeAtLeft
-];
-var positionInitializers = [
-    initializeTextPositions,
-    initializeOuterElementPositions,
-    initializeInnerElementPositions,
-    initializeVisiblyEquivalentPositionsBeforeNodes,
-    initializeVisiblyEquivalentPositionsAfterNodes
-];
-
-tests.forEach(function (testFunction) {
-    positionInitializers.forEach(function (initializePositionsFunction) {
-        [false, true].forEach(function (containerIsEditable) {
-            runSingleTest(testFunction, initializePositionsFunction, containerIsEditable);
-        });
-    });
-});
-</script>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/addRange.html b/third_party/WebKit/LayoutTests/editing/selection/addRange.html
deleted file mode 100644
index 2cb613e..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/addRange.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<p>This tests Selection::addRange().  It should have no effect if the range passed to it does not intersect the currently selected range.  '3456' should be selected.</p>
-<div id="div">123456789</div>
-
-<script>
-var sel = window.getSelection();
-var div = document.getElementById("div");
-var text = div.firstChild;
-
-var range = document.createRange();
-range.setStart(text, 3);
-range.setEnd(text, 5);
-sel.addRange(range);
-
-range = document.createRange();
-range.setStart(text, 4);
-range.setEnd(text, 6);
-sel.addRange(range);
-
-range = document.createRange();
-range.setStart(text, 2);
-range.setEnd(text, 3);
-sel.addRange(range);
-
-// This should have no effect (until we support discontiguous selections) since this range doesn't intersect the currently selected range.
-range = document.createRange();
-range.setStart(text, 7);
-range.setEnd(text, 8);
-sel.addRange(range);
-
-// Ditto.
-range = document.createRange();
-range.setStart(text, 0);
-range.setEnd(text, 1);
-sel.addRange(range);
-
-</script>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/selection_extend_in_detached_window.html b/third_party/WebKit/LayoutTests/editing/selection/selection_extend_in_detached_window.html
new file mode 100644
index 0000000..c471ecc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/editing/selection/selection_extend_in_detached_window.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<iframe></iframe>
+<script>
+window.onload = () => {
+  test(() => {
+    let iframe = document.querySelector('iframe');
+    let selection = iframe.contentWindow.getSelection();
+    iframe.remove();
+    selection.extend(document.body);
+  }, 'Selection.extend() in a detached Window should not crash');
+};
+</script>
diff --git a/third_party/WebKit/LayoutTests/editing/text-iterator/findString-start-search-after-selection-expected.txt b/third_party/WebKit/LayoutTests/editing/text-iterator/findString-start-search-after-selection-expected.txt
index 94e888d5..21973824c6 100644
--- a/third_party/WebKit/LayoutTests/editing/text-iterator/findString-start-search-after-selection-expected.txt
+++ b/third_party/WebKit/LayoutTests/editing/text-iterator/findString-start-search-after-selection-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 29: Discontiguous selection is not supported.
 The _before_selection_ word is before the selection, so we shouldn't be able to find it if span_to_select is selected. 
 The _in_selection_ word is in the selection and we should always be able to find it. 
 The _after_selection_ word is after the selection and we should always be able to find that too.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-00-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-00-expected.txt
index 369a175..2693a02 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-00-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-00-expected.txt
@@ -1,102 +1,42 @@
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 This is a testharness.js-based test.
-Found 2184 tests; 1784 PASS, 400 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 2184 tests; 1736 PASS, 448 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
@@ -129,9 +69,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -141,9 +81,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -268,7 +208,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -283,24 +225,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -310,7 +236,9 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -323,22 +251,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -362,15 +276,13 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -415,13 +327,12 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -445,13 +356,10 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -461,13 +369,10 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -477,13 +382,11 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -493,11 +396,11 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -570,7 +473,8 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -585,23 +489,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -611,7 +500,8 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -626,23 +516,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -652,16 +527,13 @@
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -847,9 +719,9 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -859,9 +731,9 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -986,7 +858,9 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1001,24 +875,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1028,7 +886,9 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1041,22 +901,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1080,15 +926,13 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1133,13 +977,12 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1163,13 +1006,10 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1179,13 +1019,10 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1195,13 +1032,11 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1211,11 +1046,11 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1288,7 +1123,8 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1303,23 +1139,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -1329,7 +1150,8 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1344,23 +1166,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -1370,16 +1177,13 @@
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -1565,9 +1369,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -1577,9 +1381,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1704,7 +1508,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1719,24 +1525,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1746,7 +1536,9 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1759,22 +1551,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1798,15 +1576,13 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1851,13 +1627,12 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1881,13 +1656,10 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1897,13 +1669,10 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1913,13 +1682,11 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1929,11 +1696,11 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -2006,7 +1773,8 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2021,23 +1789,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2047,7 +1800,8 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2062,23 +1816,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2088,16 +1827,13 @@
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -2283,9 +2019,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -2295,9 +2031,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -2422,7 +2158,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2437,24 +2175,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -2464,7 +2186,9 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -2477,22 +2201,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -2516,15 +2226,13 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -2569,13 +2277,12 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -2599,13 +2306,10 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -2615,13 +2319,10 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -2631,13 +2332,11 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -2647,11 +2346,11 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -2724,7 +2423,8 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2739,23 +2439,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2765,7 +2450,8 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2780,23 +2466,8 @@
 
 testAddRangeSubSet(0, 4);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(0, 4);
-testDiv.style.display = "none";
-"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2806,16 +2477,13 @@
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-04-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-04-expected.txt
index e684dd98..6c80527 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-04-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-04-expected.txt
@@ -1,102 +1,42 @@
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 This is a testharness.js-based test.
-Found 2184 tests; 1784 PASS, 400 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 2184 tests; 1736 PASS, 448 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
@@ -129,9 +69,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -141,9 +81,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -268,7 +208,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -283,24 +225,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -310,7 +236,9 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -323,22 +251,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -362,15 +276,13 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -415,13 +327,12 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -445,13 +356,10 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -461,13 +369,10 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -477,13 +382,11 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -493,11 +396,11 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -570,7 +473,8 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -585,23 +489,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -611,7 +500,8 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -626,23 +516,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -652,16 +527,13 @@
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -847,9 +719,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -859,9 +731,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -986,7 +858,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1001,24 +875,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1028,7 +886,9 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1041,22 +901,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1080,15 +926,13 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1133,13 +977,12 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1163,13 +1006,10 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1179,13 +1019,10 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1195,13 +1032,11 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1211,11 +1046,11 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1288,7 +1123,8 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1303,23 +1139,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -1329,7 +1150,8 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1344,23 +1166,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -1370,16 +1177,13 @@
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 5 [paras[1].firstChild, 0, paras[1].firstChild, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -1565,9 +1369,9 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -1577,9 +1381,9 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1704,7 +1508,9 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1719,24 +1525,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1746,7 +1536,9 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1759,22 +1551,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1798,15 +1576,13 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1851,13 +1627,12 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1881,13 +1656,10 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1897,13 +1669,10 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1913,13 +1682,11 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1929,11 +1696,11 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -2006,7 +1773,8 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2021,23 +1789,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2047,7 +1800,8 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2062,23 +1816,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2088,16 +1827,13 @@
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 6 [paras[1].firstChild, 2, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -2283,9 +2019,9 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -2295,9 +2031,9 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -2422,7 +2158,9 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2437,24 +2175,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -2464,7 +2186,9 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -2477,22 +2201,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -2516,15 +2226,13 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -2569,13 +2277,12 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -2599,13 +2306,10 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -2615,13 +2319,10 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -2631,13 +2332,11 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -2647,11 +2346,11 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -2724,7 +2423,8 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2739,23 +2439,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2765,7 +2450,8 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2780,23 +2466,8 @@
 
 testAddRangeSubSet(4, 8);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(4, 8);
-testDiv.style.display = "none";
-"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2806,16 +2477,13 @@
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 7 [paras[1].firstChild, 2, paras[1].firstChild, 9] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-12-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-12-expected.txt
index f07fae65..aef98ba 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-12-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-12-expected.txt
@@ -1,54 +1,24 @@
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 This is a testharness.js-based test.
-Found 1208 tests; 1008 PASS, 200 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1208 tests; 984 PASS, 224 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must do nothing 
 PASS Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must do nothing 
 PASS Range 12 [foreignPara1.firstChild, 0, foreignPara1.firstChild, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must do nothing 
@@ -197,9 +167,9 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -209,9 +179,9 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -336,7 +306,9 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -351,24 +323,8 @@
 
 testAddRangeSubSet(12, 16);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(12, 16);
-testDiv.style.display = "none";
-"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -378,7 +334,9 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -391,22 +349,8 @@
 
 testAddRangeSubSet(12, 16);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(12, 16);
-testDiv.style.display = "none";
-"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -430,15 +374,13 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -483,13 +425,12 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -513,13 +454,10 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -529,13 +467,10 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -545,13 +480,11 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -561,11 +494,11 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -638,7 +571,8 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -653,23 +587,8 @@
 
 testAddRangeSubSet(12, 16);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(12, 16);
-testDiv.style.display = "none";
-"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -679,7 +598,8 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -694,23 +614,8 @@
 
 testAddRangeSubSet(12, 16);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(12, 16);
-testDiv.style.display = "none";
-"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -720,16 +625,13 @@
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 14 [document.documentElement, 0, document.documentElement, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -915,9 +817,9 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -927,9 +829,9 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1054,7 +956,9 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1069,24 +973,8 @@
 
 testAddRangeSubSet(12, 16);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(12, 16);
-testDiv.style.display = "none";
-"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1096,7 +984,9 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1109,22 +999,8 @@
 
 testAddRangeSubSet(12, 16);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(12, 16);
-testDiv.style.display = "none";
-"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1148,15 +1024,13 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1201,13 +1075,12 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1231,13 +1104,10 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1247,13 +1117,10 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1263,13 +1130,11 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1279,11 +1144,11 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1356,7 +1221,8 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1371,23 +1237,8 @@
 
 testAddRangeSubSet(12, 16);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(12, 16);
-testDiv.style.display = "none";
-"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -1397,7 +1248,8 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1412,23 +1264,8 @@
 
 testAddRangeSubSet(12, 16);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(12, 16);
-testDiv.style.display = "none";
-"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -1438,16 +1275,13 @@
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 15 [document.documentElement, 0, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-16-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-16-expected.txt
index a13058b3..fa64c90c 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-16-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-16-expected.txt
@@ -1,78 +1,33 @@
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 This is a testharness.js-based test.
-Found 1696 tests; 1396 PASS, 300 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1696 tests; 1360 PASS, 336 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
@@ -105,9 +60,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -117,9 +72,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -244,7 +199,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -259,24 +216,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -286,7 +227,9 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -299,22 +242,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -338,15 +267,13 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -391,13 +318,12 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -421,13 +347,10 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -437,13 +360,10 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -453,13 +373,11 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -469,11 +387,11 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -546,7 +464,8 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -561,23 +480,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -587,7 +491,8 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -602,23 +507,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -628,16 +518,13 @@
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 16 [document.documentElement, 1, document.documentElement, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -823,9 +710,9 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -835,9 +722,9 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -962,7 +849,9 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -977,24 +866,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1004,7 +877,9 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1017,22 +892,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1056,15 +917,13 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1109,13 +968,12 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1139,13 +997,10 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1155,13 +1010,10 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1171,13 +1023,11 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1187,11 +1037,11 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1264,7 +1114,8 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1279,23 +1130,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -1305,7 +1141,8 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1320,23 +1157,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -1346,16 +1168,13 @@
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 17 [document.head, 1, document.head, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 17 [document.head, 1, document.head, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -1541,9 +1360,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -1553,9 +1372,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1680,7 +1499,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1695,24 +1516,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1722,7 +1527,9 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1735,22 +1542,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1774,15 +1567,13 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1827,13 +1618,12 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1857,13 +1647,10 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1873,13 +1660,10 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1889,13 +1673,11 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1905,11 +1687,11 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1982,7 +1764,8 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1997,23 +1780,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2023,7 +1791,8 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2038,23 +1807,8 @@
 
 testAddRangeSubSet(16, 20);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(16, 20);
-testDiv.style.display = "none";
-"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2064,16 +1818,13 @@
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 18 [document.body, 0, document.body, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 18 [document.body, 0, document.body, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-20-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-20-expected.txt
index 6c4ce32..55e99ae4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-20-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-20-expected.txt
@@ -1,54 +1,24 @@
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 This is a testharness.js-based test.
-Found 1208 tests; 1008 PASS, 200 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1208 tests; 984 PASS, 224 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 20 [foreignDoc.head, 1, foreignDoc.head, 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must do nothing 
 PASS Range 20 [foreignDoc.head, 1, foreignDoc.head, 1] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must do nothing 
 PASS Range 20 [foreignDoc.head, 1, foreignDoc.head, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must do nothing 
@@ -197,9 +167,9 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -209,9 +179,9 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -336,7 +306,9 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -351,24 +323,8 @@
 
 testAddRangeSubSet(20, 24);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(20, 24);
-testDiv.style.display = "none";
-"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -378,7 +334,9 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -391,22 +349,8 @@
 
 testAddRangeSubSet(20, 24);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(20, 24);
-testDiv.style.display = "none";
-"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -430,15 +374,13 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -483,13 +425,12 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -513,13 +454,10 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -529,13 +467,10 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -545,13 +480,11 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -561,11 +494,11 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -638,7 +571,8 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -653,23 +587,8 @@
 
 testAddRangeSubSet(20, 24);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(20, 24);
-testDiv.style.display = "none";
-"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -679,7 +598,8 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -694,23 +614,8 @@
 
 testAddRangeSubSet(20, 24);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(20, 24);
-testDiv.style.display = "none";
-"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -720,16 +625,13 @@
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 22 [paras[0], 0, paras[0], 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 22 [paras[0], 0, paras[0], 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -915,9 +817,9 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -927,9 +829,9 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1054,7 +956,9 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1069,24 +973,8 @@
 
 testAddRangeSubSet(20, 24);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(20, 24);
-testDiv.style.display = "none";
-"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1096,7 +984,9 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1109,22 +999,8 @@
 
 testAddRangeSubSet(20, 24);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(20, 24);
-testDiv.style.display = "none";
-"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1148,15 +1024,13 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1201,13 +1075,12 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1231,13 +1104,10 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1247,13 +1117,10 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1263,13 +1130,11 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1279,11 +1144,11 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1356,7 +1221,8 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1371,23 +1237,8 @@
 
 testAddRangeSubSet(20, 24);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(20, 24);
-testDiv.style.display = "none";
-"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -1397,7 +1248,8 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1412,23 +1264,8 @@
 
 testAddRangeSubSet(20, 24);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(20, 24);
-testDiv.style.display = "none";
-"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -1438,16 +1275,13 @@
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 23 [paras[0], 0, paras[0], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 23 [paras[0], 0, paras[0], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-24-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-24-expected.txt
index 16efcb5..ddb0e0a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-24-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-24-expected.txt
@@ -114,57 +114,27 @@
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 This is a testharness.js-based test.
-Found 1208 tests; 1008 PASS, 200 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1208 tests; 984 PASS, 224 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 24 [detachedPara1, 0, detachedPara1, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must do nothing 
 PASS Range 24 [detachedPara1, 0, detachedPara1, 0] followed by Range 1 [paras[0].firstChild, 0, paras[0].firstChild, 1]: first addRange() must do nothing 
 PASS Range 24 [detachedPara1, 0, detachedPara1, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: first addRange() must do nothing 
@@ -313,9 +283,9 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -325,9 +295,9 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -452,7 +422,9 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -467,24 +439,8 @@
 
 testAddRangeSubSet(24, 28);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(24, 28);
-testDiv.style.display = "none";
-"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -494,7 +450,9 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -507,22 +465,8 @@
 
 testAddRangeSubSet(24, 28);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(24, 28);
-testDiv.style.display = "none";
-"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -546,15 +490,13 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -599,13 +541,12 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -629,13 +570,10 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -645,13 +583,10 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -661,13 +596,11 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -677,11 +610,11 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -754,7 +687,8 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -769,23 +703,8 @@
 
 testAddRangeSubSet(24, 28);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(24, 28);
-testDiv.style.display = "none";
-"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -795,7 +714,8 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -810,23 +730,8 @@
 
 testAddRangeSubSet(24, 28);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(24, 28);
-testDiv.style.display = "none";
-"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -836,16 +741,13 @@
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -1031,9 +933,9 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -1043,9 +945,9 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1170,7 +1072,9 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1185,24 +1089,8 @@
 
 testAddRangeSubSet(24, 28);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(24, 28);
-testDiv.style.display = "none";
-"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1212,7 +1100,9 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1225,22 +1115,8 @@
 
 testAddRangeSubSet(24, 28);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(24, 28);
-testDiv.style.display = "none";
-"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1264,15 +1140,13 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1317,13 +1191,12 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1347,13 +1220,10 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1363,13 +1233,10 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1379,13 +1246,11 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1395,11 +1260,11 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1472,7 +1337,8 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1487,23 +1353,8 @@
 
 testAddRangeSubSet(24, 28);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(24, 28);
-testDiv.style.display = "none";
-"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -1513,7 +1364,8 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1528,23 +1380,8 @@
 
 testAddRangeSubSet(24, 28);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(24, 28);
-testDiv.style.display = "none";
-"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -1554,16 +1391,13 @@
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-28-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-28-expected.txt
index dccdd28..4c6a241 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-28-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-28-expected.txt
@@ -1,102 +1,42 @@
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 This is a testharness.js-based test.
-Found 2184 tests; 1784 PASS, 400 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 2184 tests; 1736 PASS, 448 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
@@ -129,9 +69,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -141,9 +81,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -268,7 +208,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -283,24 +225,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -310,7 +236,9 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -323,22 +251,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -362,15 +276,13 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -415,13 +327,12 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -445,13 +356,10 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -461,13 +369,10 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -477,13 +382,11 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -493,11 +396,11 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -570,7 +473,8 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -585,23 +489,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -611,7 +500,8 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -626,23 +516,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -652,16 +527,13 @@
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 28 [paras[0].firstChild, 3, paras[3], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -847,9 +719,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -859,9 +731,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -986,7 +858,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1001,24 +875,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1028,7 +886,9 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1041,22 +901,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1080,15 +926,13 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1133,13 +977,12 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1163,13 +1006,10 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1179,13 +1019,10 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1195,13 +1032,11 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1211,11 +1046,11 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1288,7 +1123,8 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1303,23 +1139,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -1329,7 +1150,8 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1344,23 +1166,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -1370,16 +1177,13 @@
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 29 [paras[0], 0, paras[0].firstChild, 7] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -1565,9 +1369,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -1577,9 +1381,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1704,7 +1508,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1719,24 +1525,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1746,7 +1536,9 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1759,22 +1551,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1798,15 +1576,13 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1851,13 +1627,12 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1881,13 +1656,10 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1897,13 +1669,10 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1913,13 +1682,11 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1929,11 +1696,11 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -2006,7 +1773,8 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2021,23 +1789,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2047,7 +1800,8 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2062,23 +1816,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2088,16 +1827,13 @@
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 30 [testDiv, 2, paras[4], 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 30 [testDiv, 2, paras[4], 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -2283,9 +2019,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -2295,9 +2031,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -2422,7 +2158,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2437,24 +2175,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -2464,7 +2186,9 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -2477,22 +2201,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -2516,15 +2226,13 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -2569,13 +2277,12 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -2599,13 +2306,10 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -2615,13 +2319,10 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -2631,13 +2332,11 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -2647,11 +2346,11 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -2724,7 +2423,8 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2739,23 +2439,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2765,7 +2450,8 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2780,23 +2466,8 @@
 
 testAddRangeSubSet(28, 32);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(28, 32);
-testDiv.style.display = "none";
-"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2806,16 +2477,13 @@
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 31 [testDiv, 1, paras[2].firstChild, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-32-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-32-expected.txt
index ca8e651..9ead3ce4 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-32-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-32-expected.txt
@@ -1,78 +1,33 @@
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 This is a testharness.js-based test.
-Found 1696 tests; 1396 PASS, 300 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1696 tests; 1360 PASS, 336 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
@@ -105,9 +60,9 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -117,9 +72,9 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -244,7 +199,9 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -259,24 +216,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -286,7 +227,9 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -299,22 +242,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -338,15 +267,13 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -391,13 +318,12 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -421,13 +347,10 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -437,13 +360,10 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -453,13 +373,11 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -469,11 +387,11 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -546,7 +464,8 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -561,23 +480,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -587,7 +491,8 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -602,23 +507,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -628,16 +518,13 @@
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 32 [document.documentElement, 1, document.body, 0] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 32 [document.documentElement, 1, document.body, 0] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -881,9 +768,9 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -893,9 +780,9 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1020,7 +907,9 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1035,24 +924,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1062,7 +935,9 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1075,22 +950,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1114,15 +975,13 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1167,13 +1026,12 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1197,13 +1055,10 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1213,13 +1068,10 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1229,13 +1081,11 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1245,11 +1095,11 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1322,7 +1172,8 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1337,23 +1188,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -1363,7 +1199,8 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1378,23 +1215,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -1404,16 +1226,13 @@
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 34 [document, 0, document, 1] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 34 [document, 0, document, 1] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -1599,9 +1418,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -1611,9 +1430,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1738,7 +1557,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1753,24 +1574,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1780,7 +1585,9 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1793,22 +1600,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1832,15 +1625,13 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1885,13 +1676,12 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1915,13 +1705,10 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1931,13 +1718,10 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1947,13 +1731,11 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1963,11 +1745,11 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -2040,7 +1822,8 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2055,23 +1838,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2081,7 +1849,8 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2096,23 +1865,8 @@
 
 testAddRangeSubSet(32, 36);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(32, 36);
-testDiv.style.display = "none";
-"
-FAIL Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2122,16 +1876,13 @@
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 35 [document, 0, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 35 [document, 0, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-36-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-36-expected.txt
index 0184bd0c..1d81d91a 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-36-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/addRange-36-expected.txt
@@ -1,102 +1,42 @@
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE WARNING: line 24: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
-CONSOLE ERROR: line 24: Discontiguous selection is not supported.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
+CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 CONSOLE ERROR: line 8: The given range isn't in document.
 This is a testharness.js-based test.
-Found 2184 tests; 1784 PASS, 400 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 2184 tests; 1736 PASS, 448 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in rangeCount being 1 
 PASS Range 36 [document, 1, document, 2] followed by Range 0 [paras[0].firstChild, 0, paras[0].firstChild, 0]: first addRange() must result in the selection's last range having the specified endpoints 
@@ -129,9 +69,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -141,9 +81,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -268,7 +208,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -283,24 +225,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -310,7 +236,9 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -323,22 +251,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -362,15 +276,13 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -415,13 +327,12 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -445,13 +356,10 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -461,13 +369,10 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -477,13 +382,11 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -493,11 +396,11 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -570,7 +473,8 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -585,23 +489,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -611,7 +500,8 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -626,23 +516,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -652,16 +527,13 @@
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 36 [document, 1, document, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 36 [document, 1, document, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -847,9 +719,9 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -859,9 +731,9 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -986,7 +858,9 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1001,24 +875,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1028,7 +886,9 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1041,22 +901,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1080,15 +926,13 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1133,13 +977,12 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1163,13 +1006,10 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1179,13 +1019,10 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1195,13 +1032,11 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1211,11 +1046,11 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -1288,7 +1123,8 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1303,23 +1139,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -1329,7 +1150,8 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1344,23 +1166,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -1370,16 +1177,13 @@
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 37 [testDiv, 0, comment, 5] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 37 [testDiv, 0, comment, 5] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -1565,9 +1369,9 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -1577,9 +1381,9 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -1704,7 +1508,9 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -1719,24 +1525,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -1746,7 +1536,9 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -1759,22 +1551,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -1798,15 +1576,13 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -1851,13 +1627,12 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -1881,13 +1656,10 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -1897,13 +1669,10 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -1913,13 +1682,11 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -1929,11 +1696,11 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -2006,7 +1773,8 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2021,23 +1789,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2047,7 +1800,8 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2062,23 +1816,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2088,16 +1827,13 @@
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 38 [paras[2].firstChild, 4, comment, 2] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
@@ -2283,9 +2019,9 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object "b̈c̈d̈"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 2 [paras[0].firstChild, 2, paras[0].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: first addRange() must result in rangeCount being 1 
@@ -2295,9 +2031,9 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object "b̈c̈d̈e"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 2
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 2 but got 6
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "b̈c̈d̈e" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 3 [paras[0].firstChild, 2, paras[0].firstChild, 9]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 4 [paras[1].firstChild, 0, paras[1].firstChild, 0]: first addRange() must result in rangeCount being 1 
@@ -2422,7 +2158,9 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2437,24 +2175,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 15 [document.documentElement, 0, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: first addRange() must result in rangeCount being 1 
@@ -2464,7 +2186,9 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <html><head><title>Selection.addRange() tests</title>
+<me... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
 QrstuvwxYzabcdefGhijklmn
@@ -2477,22 +2201,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <html><head><title>Selection.addRange() tests</title>
-<me...
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 16 [document.documentElement, 1, document.documentElement, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 17 [document.head, 1, document.head, 1]: first addRange() must result in rangeCount being 1 
@@ -2516,15 +2226,13 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 18 [document.body, 0, document.body, 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 19 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]: first addRange() must result in rangeCount being 1 
@@ -2569,13 +2277,12 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 23 [paras[0], 0, paras[0], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 24 [detachedPara1, 0, detachedPara1, 0]: first addRange() must result in rangeCount being 1 
@@ -2599,13 +2306,10 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 26 [paras[0].firstChild, 0, paras[1].firstChild, 0]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: first addRange() must result in rangeCount being 1 
@@ -2615,13 +2319,10 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, endContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Text node "Ijklmnop
-"
+Ijklmnop" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 27 [paras[0].firstChild, 0, paras[1].firstChild, 8]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: first addRange() must result in rangeCount being 1 
@@ -2631,13 +2332,11 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startOffset of the Selection's last Range must match the added Range expected 3 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdef" but got object "̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdef"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 3
+QrstuvwxYzabcdef" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 28 [paras[0].firstChild, 3, paras[3], 1]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: first addRange() must result in rangeCount being 1 
@@ -2647,11 +2346,11 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object "Äb̈c̈d"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 29 [paras[0], 0, paras[0].firstChild, 7]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 30 [testDiv, 2, paras[4], 1]: first addRange() must result in rangeCount being 1 
@@ -2724,7 +2423,8 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2739,23 +2439,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 35 [document, 0, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: first addRange() must result in rangeCount being 1 
@@ -2765,7 +2450,8 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in rangeCount being 1 
-PASS Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints 
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Selection.addRange() tests
 
 Äb̈c̈d̈ëf̈g̈ḧ
@@ -2780,23 +2466,8 @@
 
 testAddRangeSubSet(36, 40);
 testDiv.style.display = "none";
-" but got object "Selection.addRange() tests
-
-Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn
-
-
-
-
-
-"use strict";
-
-testAddRangeSubSet(36, 40);
-testDiv.style.display = "none";
-"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Document node with 2 children
+" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 36 [document, 1, document, 2]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: first addRange() must result in rangeCount being 1 
@@ -2806,16 +2477,13 @@
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the first added Range 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in rangeCount being 1 
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: endContainer of the Selection's last Range must match the added Range expected Comment node <!--Alphabet soup?--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range having the specified endpoints assert_equals: startContainer of the Selection's last Range must match the added Range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: second addRange() must result in the selection's last range being the same object we added assert_equals: getRangeAt(rangeCount - 1) must return the same object we added expected object "Äb̈c̈d̈ëf̈g̈ḧ
 Ijklmnop
-QrstuvwxYzabcdefGhijklmn" but got object "Äb̈c̈d̈ëf̈g̈ḧ
-Ijklmnop
-QrstuvwxYzabcdefGhijklmn"
-FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startContainer of the Selection's last Range must match the added Range expected Text node "Äb̈c̈d̈ëf̈g̈ḧ
-" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
+QrstuvwxYzabcdefGhijklmn" but got object ""
+FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the second added range must modify the Selection's last Range assert_equals: After mutating the second added Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 FAIL Range 39 [paras[3], 1, comment, 8] followed by Range 37 [testDiv, 0, comment, 5]: modifying the Selection's last Range must modify the second added Range assert_equals: After second addRange(), after mutating the Selection's last Range, startOffset of the Selection's last Range must match the added Range expected 0 but got 6
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must not throw exceptions or modify the range it's given 
 PASS Range 39 [paras[3], 1, comment, 8] followed by Range 38 [paras[2].firstChild, 4, comment, 2]: first addRange() must result in rangeCount being 1 
diff --git a/third_party/WebKit/LayoutTests/fast/css/first-letter-rtc-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/css/first-letter-rtc-crash-expected.txt
index 9c31c0b..594e02e 100644
--- a/third_party/WebKit/LayoutTests/fast/css/first-letter-rtc-crash-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/first-letter-rtc-crash-expected.txt
@@ -1,12 +1,4 @@
-CONSOLE ERROR: line 21: Discontiguous selection is not supported.
-CONSOLE ERROR: line 21: Discontiguous selection is not supported.
-CONSOLE WARNING: line 21: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 21: Discontiguous selection is not supported.
-CONSOLE ERROR: line 21: Discontiguous selection is not supported.
-CONSOLE ERROR: line 21: Discontiguous selection is not supported.
-CONSOLE ERROR: line 21: Discontiguous selection is not supported.
-CONSOLE ERROR: line 21: Discontiguous selection is not supported.
-CONSOLE ERROR: line 21: Discontiguous selection is not supported.
+CONSOLE WARNING: line 21: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 CONSOLE ERROR: line 38: Uncaught HierarchyRequestError: Failed to execute 'insertNode' on 'Range': The node to be inserted contains the insertion point; it may not be inserted into itself.
-texta
+a
 Test passes if it does not CRASH.
diff --git a/third_party/WebKit/LayoutTests/fast/css/invalidation/selection-pseudo-expected.txt b/third_party/WebKit/LayoutTests/fast/css/invalidation/selection-pseudo-expected.txt
index 3272a70..4936d9c2 100644
--- a/third_party/WebKit/LayoutTests/fast/css/invalidation/selection-pseudo-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/invalidation/selection-pseudo-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 43: Discontiguous selection is not supported.
 Style invalidation for ::selection
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/css/invalidation/sheet-ruleset-invalidation.html b/third_party/WebKit/LayoutTests/fast/css/invalidation/sheet-ruleset-invalidation.html
index d513ff27..a3afa85 100644
--- a/third_party/WebKit/LayoutTests/fast/css/invalidation/sheet-ruleset-invalidation.html
+++ b/third_party/WebKit/LayoutTests/fast/css/invalidation/sheet-ruleset-invalidation.html
@@ -13,6 +13,10 @@
     </div>
     <span></span>
 </div>
+<div id="placeholderWrapper">
+    <textarea placeholder="Placeholder text"></textarea>
+</div>
+<textarea placeholder="Placeholder text"></textarea>
 <script>
     test(() => {
         assert_true(!!window.internals, "Tests require window.internals.");
@@ -43,4 +47,22 @@
             "#found div { background: red }"), 1,
             "Check that only one of the divs is recalculated.");
     }, "A type selector scoped by a known id should only invalidate descendants of the element with that id.");
+
+    test(() => {
+        assert_equals(applyRuleAndReturnAffectedElementCount(
+            "::-webkit-input-placeholder { background: green }"), 2,
+            "Check that only custom pseudo elements are recalculated.");
+    }, "A style rule with a custom pseudo element should only invalidate custom pseudo elements.");
+
+    test(() => {
+        assert_equals(applyRuleAndReturnAffectedElementCount(
+            "#notfound ::-webkit-input-placeholder { background: green }"), 0,
+            "Check that no elements are recalculated.");
+    }, "A custom pseudo element scoped in an unknown id should not invalidate any elements.");
+
+    test(() => {
+        assert_equals(applyRuleAndReturnAffectedElementCount(
+            "#placeholderWrapper ::-webkit-input-placeholder { background: green }"), 1,
+            "Check that only the scoped custom pseudo element is recalculated.");
+    }, "A custom pseudo element scoped in a known id should only invalidate descendants of the element with that id.");
 </script>
diff --git a/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash-expected.txt b/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash-expected.txt
index 0efc0ca..2799b65 100644
--- a/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash-expected.txt
+++ b/third_party/WebKit/LayoutTests/fullscreen/full-screen-contentEditable-crash-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: line 22: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
+CONSOLE WARNING: line 22: The behavior that Selection.addRange() merges existing Range and the specified Range was removed. See https://www.chromestatus.com/features/6680566019653632 for more details.
 Pass if there is no crash.
 Click anywhere to test manually.
diff --git a/third_party/WebKit/LayoutTests/platform/android/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt b/third_party/WebKit/LayoutTests/platform/android/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
index 999d3d4..831eb221 100644
--- a/third_party/WebKit/LayoutTests/platform/android/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/android/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: Discontiguous selection is not supported.
 PASS repainted when expected
 PASS repainted when expected
 PASS repainted when expected
diff --git a/third_party/WebKit/LayoutTests/platform/linux/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
index f97dd19..dded8e3 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 56: Discontiguous selection is not supported.
 PASS repainted when expected
 FAIL did not repaint when expected
 PASS repainted when expected
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/addRange-expected.png b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/addRange-expected.png
deleted file mode 100644
index 8802d62e..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/addRange-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/addRange-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/editing/selection/addRange-expected.txt
deleted file mode 100644
index a006f41..0000000
--- a/third_party/WebKit/LayoutTests/platform/linux/editing/selection/addRange-expected.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-CONSOLE WARNING: line 17: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 28: Discontiguous selection is not supported.
-CONSOLE ERROR: line 34: Discontiguous selection is not supported.
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x40
-        LayoutText {#text} at (0,0) size 765x39
-          text run at (0,0) width 200: "This tests Selection::addRange(). "
-          text run at (200,0) width 565: "It should have no effect if the range passed to it does not intersect the currently selected range."
-          text run at (0,20) width 157: "'3456' should be selected."
-      LayoutBlockFlow {DIV} at (0,56) size 784x20
-        LayoutText {#text} at (0,0) size 72x19
-          text run at (0,0) width 72: "123456789"
-selection start: position 2 of child 0 {#text} of child 2 {DIV} of body
-selection end:   position 6 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
index f97dd19..dded8e3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.10/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.10/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 56: Discontiguous selection is not supported.
 PASS repainted when expected
 FAIL did not repaint when expected
 PASS repainted when expected
diff --git a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
index f97dd19..dded8e3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac-mac10.9/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 56: Discontiguous selection is not supported.
 PASS repainted when expected
 FAIL did not repaint when expected
 PASS repainted when expected
diff --git a/third_party/WebKit/LayoutTests/platform/mac-retina/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt b/third_party/WebKit/LayoutTests/platform/mac-retina/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
index f97dd19..dded8e3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac-retina/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac-retina/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 56: Discontiguous selection is not supported.
 PASS repainted when expected
 FAIL did not repaint when expected
 PASS repainted when expected
diff --git a/third_party/WebKit/LayoutTests/platform/mac/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
index f97dd19..dded8e3 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 56: Discontiguous selection is not supported.
 PASS repainted when expected
 FAIL did not repaint when expected
 PASS repainted when expected
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/addRange-expected.png b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/addRange-expected.png
deleted file mode 100644
index 020b5b0..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/addRange-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/addRange-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/editing/selection/addRange-expected.txt
deleted file mode 100644
index 8ef877cf8..0000000
--- a/third_party/WebKit/LayoutTests/platform/mac/editing/selection/addRange-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-CONSOLE WARNING: line 17: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 28: Discontiguous selection is not supported.
-CONSOLE ERROR: line 34: Discontiguous selection is not supported.
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 777x36
-          text run at (0,0) width 216: "This tests Selection::addRange(). "
-          text run at (215,0) width 562: "It should have no effect if the range passed to it does not intersect the currently selected"
-          text run at (0,18) width 44: "range. "
-          text run at (43,18) width 164: "'3456' should be selected."
-      LayoutBlockFlow {DIV} at (0,52) size 784x18
-        LayoutText {#text} at (0,0) size 72x18
-          text run at (0,0) width 72: "123456789"
-selection start: position 2 of child 0 {#text} of child 2 {DIV} of body
-selection end:   position 6 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt b/third_party/WebKit/LayoutTests/platform/win/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
index f97dd19..dded8e3 100644
--- a/third_party/WebKit/LayoutTests/platform/win/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 56: Discontiguous selection is not supported.
 PASS repainted when expected
 FAIL did not repaint when expected
 PASS repainted when expected
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/addRange-expected.png b/third_party/WebKit/LayoutTests/platform/win/editing/selection/addRange-expected.png
deleted file mode 100644
index a58fa9b..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/addRange-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/platform/win/editing/selection/addRange-expected.txt b/third_party/WebKit/LayoutTests/platform/win/editing/selection/addRange-expected.txt
deleted file mode 100644
index cac62d66..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/editing/selection/addRange-expected.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-CONSOLE WARNING: line 17: The behavior that Selection.addRange() merges existing Range and the specified Range is deprecated and will be removed in M58, around April 2017. See https://www.chromestatus.com/features/6680566019653632 for more details.
-CONSOLE ERROR: line 28: Discontiguous selection is not supported.
-CONSOLE ERROR: line 34: Discontiguous selection is not supported.
-layer at (0,0) size 800x600
-  LayoutView at (0,0) size 800x600
-layer at (0,0) size 800x600
-  LayoutBlockFlow {HTML} at (0,0) size 800x600
-    LayoutBlockFlow {BODY} at (8,8) size 784x584
-      LayoutBlockFlow {P} at (0,0) size 784x36
-        LayoutText {#text} at (0,0) size 777x35
-          text run at (0,0) width 216: "This tests Selection::addRange(). "
-          text run at (215,0) width 562: "It should have no effect if the range passed to it does not intersect the currently selected"
-          text run at (0,18) width 44: "range. "
-          text run at (43,18) width 164: "'3456' should be selected."
-      LayoutBlockFlow {DIV} at (0,52) size 784x18
-        LayoutText {#text} at (0,0) size 72x17
-          text run at (0,0) width 72: "123456789"
-selection start: position 2 of child 0 {#text} of child 2 {DIV} of body
-selection end:   position 6 of child 0 {#text} of child 2 {DIV} of body
diff --git a/third_party/WebKit/LayoutTests/platform/win7/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt b/third_party/WebKit/LayoutTests/platform/win7/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
index f97dd19..dded8e3 100644
--- a/third_party/WebKit/LayoutTests/platform/win7/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win7/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 56: Discontiguous selection is not supported.
 PASS repainted when expected
 FAIL did not repaint when expected
 PASS repainted when expected
diff --git a/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
index f97dd19..dded8e3 100644
--- a/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/prefer_compositing_to_lcd_text/compositing/overflow/do-not-repaint-if-scrolling-composited-layers-expected.txt
@@ -1,4 +1,3 @@
-CONSOLE ERROR: line 56: Discontiguous selection is not supported.
 PASS repainted when expected
 FAIL did not repaint when expected
 PASS repainted when expected
diff --git a/third_party/WebKit/Source/core/css/RuleFeature.cpp b/third_party/WebKit/Source/core/css/RuleFeature.cpp
index ec4bba5..9a9dffcd 100644
--- a/third_party/WebKit/Source/core/css/RuleFeature.cpp
+++ b/third_party/WebKit/Source/core/css/RuleFeature.cpp
@@ -480,12 +480,23 @@
 
 void RuleFeatureSet::updateRuleSetInvalidation(
     const InvalidationSetFeatures& features) {
-  if (!features.hasFeaturesForRuleSetInvalidation) {
-    if (features.forceSubtree || features.tagNames.isEmpty())
-      m_metadata.needsFullRecalcForRuleSetInvalidation = true;
-    else
-      addTagNamesToTypeRuleInvalidationSet(features.tagNames);
+  if (features.hasFeaturesForRuleSetInvalidation)
+    return;
+  if (features.forceSubtree ||
+      (!features.customPseudoElement && features.tagNames.isEmpty())) {
+    m_metadata.needsFullRecalcForRuleSetInvalidation = true;
+    return;
   }
+
+  ensureTypeRuleInvalidationSet();
+
+  if (features.customPseudoElement) {
+    m_typeRuleInvalidationSet->setCustomPseudoInvalid();
+    m_typeRuleInvalidationSet->setTreeBoundaryCrossing();
+  }
+
+  for (auto tagName : features.tagNames)
+    m_typeRuleInvalidationSet->addTagName(tagName);
 }
 
 void RuleFeatureSet::updateInvalidationSetsForContentAttribute(
@@ -1167,14 +1178,6 @@
                                  descendantFeatures);
 }
 
-void RuleFeatureSet::addTagNamesToTypeRuleInvalidationSet(
-    const Vector<AtomicString>& tagNames) {
-  DCHECK(!tagNames.isEmpty());
-  ensureTypeRuleInvalidationSet();
-  for (auto tagName : tagNames)
-    m_typeRuleInvalidationSet->addTagName(tagName);
-}
-
 DEFINE_TRACE(RuleFeatureSet) {
   visitor->trace(m_siblingRules);
   visitor->trace(m_uncommonAttributeRules);
diff --git a/third_party/WebKit/Source/core/css/RuleFeature.h b/third_party/WebKit/Source/core/css/RuleFeature.h
index 40bd9bd..f0f4fee2 100644
--- a/third_party/WebKit/Source/core/css/RuleFeature.h
+++ b/third_party/WebKit/Source/core/css/RuleFeature.h
@@ -281,7 +281,6 @@
       const InvalidationSetFeatures& descendantFeatures);
 
   void updateRuleSetInvalidation(const InvalidationSetFeatures&);
-  void addTagNamesToTypeRuleInvalidationSet(const Vector<AtomicString>&);
 
   FeatureMetadata m_metadata;
   InvalidationSetMap m_classInvalidationSets;
diff --git a/third_party/WebKit/Source/core/css/RuleFeatureSetTest.cpp b/third_party/WebKit/Source/core/css/RuleFeatureSetTest.cpp
index 2ba63294..756a650 100644
--- a/third_party/WebKit/Source/core/css/RuleFeatureSetTest.cpp
+++ b/third_party/WebKit/Source/core/css/RuleFeatureSetTest.cpp
@@ -1000,7 +1000,7 @@
 TEST_F(RuleFeatureSetTest, RuleSetInvalidationCustomPseudo) {
   EXPECT_EQ(RuleFeatureSet::SelectorMayMatch,
             collectFeatures("::-webkit-slider-thumb"));
-  expectFullRecalcForRuleSetInvalidation(true);
+  expectFullRecalcForRuleSetInvalidation(false);
   clearFeatures();
 
   EXPECT_EQ(RuleFeatureSet::SelectorMayMatch,
diff --git a/third_party/WebKit/Source/core/dom/StyleEngineTest.cpp b/third_party/WebKit/Source/core/dom/StyleEngineTest.cpp
index 7859ffbc..60f4c16 100644
--- a/third_party/WebKit/Source/core/dom/StyleEngineTest.cpp
+++ b/third_party/WebKit/Source/core/dom/StyleEngineTest.cpp
@@ -184,6 +184,23 @@
   EXPECT_EQ(1u, afterCount - beforeCount);
 }
 
+TEST_F(StyleEngineTest, RuleSetInvalidationCustomPseudo) {
+  document().body()->setInnerHTML(
+      "<style>progress { -webkit-appearance:none }</style>"
+      "<progress></progress>"
+      "<div></div><div></div><div></div><div></div><div></div><div></div>");
+
+  document().view()->updateAllLifecyclePhases();
+
+  unsigned beforeCount = styleEngine().styleForElementCount();
+  EXPECT_EQ(scheduleInvalidationsForRules(
+                document(), "::-webkit-progress-bar { background: green }"),
+            RuleSetInvalidationsScheduled);
+  document().view()->updateAllLifecyclePhases();
+  unsigned afterCount = styleEngine().styleForElementCount();
+  EXPECT_EQ(3u, afterCount - beforeCount);
+}
+
 TEST_F(StyleEngineTest, RuleSetInvalidationHost) {
   document().body()->setInnerHTML("<div id=nohost></div><div id=host></div>");
   Element* host = document().getElementById("host");
diff --git a/third_party/WebKit/Source/core/editing/DOMSelection.cpp b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
index ae43837..e148177 100644
--- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
@@ -66,6 +66,8 @@
   m_treeScope = nullptr;
 }
 
+// TODO(editing-dev): The behavior after loosing browsing context is not
+// specified. https://github.com/w3c/selection-api/issues/82
 bool DOMSelection::isAvailable() const {
   return frame() && frame()->selection().isAvailable();
 }
@@ -434,6 +436,9 @@
                           int offset,
                           ExceptionState& exceptionState) {
   DCHECK(node);
+  if (!isAvailable())
+    return;
+
   // 1. If node's root is not the document associated with the context object,
   // abort these steps.
   if (!isValidForPosition(node))
@@ -611,7 +616,7 @@
   // no longer performs synchronous layout by itself.
   frame()->document()->updateStyleAndLayoutIgnorePendingStylesheets();
 
-  if (selection.isNone()) {
+  if (rangeCount() == 0) {
     selection.setSelectedRange(EphemeralRange(newRange), VP_DEFAULT_AFFINITY);
     cacheRangeIfSelectionOfDocument(newRange);
     return;
@@ -619,17 +624,8 @@
 
   Range* originalRange = selection.firstRange();
 
-  if (originalRange->startContainer()->document() !=
-      newRange->startContainer()->document()) {
-    addConsoleError(
-        "The given range does not belong to the current selection's document.");
-    return;
-  }
   if (originalRange->startContainer()->treeScope() !=
       newRange->startContainer()->treeScope()) {
-    addConsoleError(
-        "The given range and the current selection belong to two different "
-        "document fragments.");
     return;
   }
 
@@ -637,32 +633,14 @@
                                            ASSERT_NO_EXCEPTION) < 0 ||
       newRange->compareBoundaryPoints(Range::kStartToEnd, originalRange,
                                       ASSERT_NO_EXCEPTION) < 0) {
-    addConsoleError("Discontiguous selection is not supported.");
     return;
   }
 
-  // FIXME: "Merge the ranges if they intersect" is Blink-specific behavior;
-  // other browsers supporting discontiguous selection (obviously) keep each
-  // Range added and return it in getRangeAt(). But it's unclear if we can
-  // really do the same, since we don't support discontiguous selection. Further
-  // discussions at
+  // TODO(tkent): "Merge the ranges if they intersect" was removed. We show a
+  // warning message for a while, and continue to collect the usage data.
   // <https://code.google.com/p/chromium/issues/detail?id=353069>.
   Deprecation::countDeprecation(frame(),
                                 UseCounter::SelectionAddRangeIntersect);
-
-  Range* start = originalRange->compareBoundaryPoints(
-                     Range::kStartToStart, newRange, ASSERT_NO_EXCEPTION) < 0
-                     ? originalRange
-                     : newRange;
-  Range* end = originalRange->compareBoundaryPoints(Range::kEndToEnd, newRange,
-                                                    ASSERT_NO_EXCEPTION) < 0
-                   ? newRange
-                   : originalRange;
-  const EphemeralRange merged =
-      EphemeralRange(start->startPosition(), end->endPosition());
-  TextAffinity affinity = selection.selection().affinity();
-  selection.setSelectedRange(merged, affinity);
-  cacheRangeIfSelectionOfDocument(createRange(merged));
 }
 
 void DOMSelection::deleteFromDocument() {
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
index 89a0135c..bef7a92 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -119,26 +119,6 @@
   return selectionInDOMTree().isHandleVisible();
 }
 
-// TODO(yosin): We should replace |visibleSelection<EditingStrategy>()| to
-// |computeVisibleSelectionInDOMTree()|.
-// TODO(yosin): To avoid undefined symbols in clang, we explicitly
-// have specialized version of |FrameSelection::visibleSelection<Strategy>|
-// before |FrameSelection::selection()| which refers this.
-template <>
-const VisibleSelection& FrameSelection::visibleSelection<EditingStrategy>()
-    const {
-  return m_selectionEditor->visibleSelection<EditingStrategy>();
-}
-
-// TODO(yosin): We should replace
-// |visibleSelection<EditingInFlatTreeStrategy>()| with
-// |computeVisibleSelectionInFlatTree()|.
-template <>
-const VisibleSelectionInFlatTree&
-FrameSelection::visibleSelection<EditingInFlatTreeStrategy>() const {
-  return m_selectionEditor->visibleSelection<EditingInFlatTreeStrategy>();
-}
-
 const VisibleSelection& FrameSelection::computeVisibleSelectionInDOMTree()
     const {
   return m_selectionEditor->computeVisibleSelectionInDOMTree();
@@ -177,7 +157,7 @@
 }
 
 const VisibleSelectionInFlatTree& FrameSelection::selectionInFlatTree() const {
-  return visibleSelection<EditingInFlatTreeStrategy>();
+  return computeVisibleSelectionInFlatTree();
 }
 
 void FrameSelection::moveCaretSelection(const IntPoint& point) {
@@ -343,17 +323,6 @@
       options, align, granularity);
 }
 
-// TODO(yosin): We should move |computePositionForChildrenRemoval()| to
-// "SelectionEditor.cpp" since it used only in
-// |SelectionEditor::nodeChildrenWillBeRemoved()|.
-static Position computePositionForChildrenRemoval(const Position& position,
-                                                  ContainerNode& container) {
-  Node* node = position.computeContainerNode();
-  if (container.containsIncludingHostElements(*node))
-    return Position::firstPositionInNode(&container);
-  return position;
-}
-
 void FrameSelection::nodeChildrenWillBeRemoved(ContainerNode& container) {
   if (!container.inActiveDocument())
     return;
@@ -363,55 +332,6 @@
     TypingCommand::closeTyping(m_frame);
 }
 
-// TODO(yosin): We should move |SelectionEditor::nodeChildrenWillBeRemoved()|
-// to "SelectionEditor.cpp".
-void SelectionEditor::nodeChildrenWillBeRemoved(ContainerNode& container) {
-  if (m_selection.isNone())
-    return;
-  const Position oldBase = m_selection.m_base;
-  const Position oldExtent = m_selection.m_extent;
-  const Position& newBase =
-      computePositionForChildrenRemoval(oldBase, container);
-  const Position& newExtent =
-      computePositionForChildrenRemoval(oldExtent, container);
-  if (newBase == oldBase && newExtent == oldExtent)
-    return;
-  m_selection = SelectionInDOMTree::Builder()
-                    .setBaseAndExtent(newBase, newExtent)
-                    .build();
-  markCacheDirty();
-}
-
-// TODO(yosin): We should move |computePositionForChildrenRemoval()| with
-// |nodeWillBeRemoved()| to "SelectionEditor.cpp".
-static Position computePositionForNodeRemoval(const Position& position,
-                                              Node& nodeToBeRemoved) {
-  Position result = position;
-  // TODO(yosin): We should rename |updatePositionForNodeRemoval()|
-  // to |computePositionForNodeRemoval()| to avoid using output parameter.
-  updatePositionForNodeRemoval(result, nodeToBeRemoved);
-  return result;
-}
-
-// TODO(yosin): We should move |nodeWillBeRemoved()| to
-// "SelectionEditor.cpp".
-void SelectionEditor::nodeWillBeRemoved(Node& nodeToBeRemoved) {
-  if (m_selection.isNone())
-    return;
-  const Position oldBase = m_selection.m_base;
-  const Position oldExtent = m_selection.m_extent;
-  const Position& newBase =
-      computePositionForNodeRemoval(oldBase, nodeToBeRemoved);
-  const Position& newExtent =
-      computePositionForNodeRemoval(oldExtent, nodeToBeRemoved);
-  if (newBase == oldBase && newExtent == oldExtent)
-    return;
-  m_selection = SelectionInDOMTree::Builder()
-                    .setBaseAndExtent(newBase, newExtent)
-                    .build();
-  markCacheDirty();
-}
-
 void FrameSelection::nodeWillBeRemoved(Node& node) {
   // There can't be a selection inside a fragment, so if a fragment's node is
   // being removed, the selection in the document that created the fragment
@@ -424,163 +344,6 @@
     TypingCommand::closeTyping(m_frame);
 }
 
-// TODO(yosin): We should move |updatePositionAfterAdoptingTextReplacement()|
-// to "SelectionEditor.cpp" since it used only in
-// |SelectionEditor::didUpdateCharacterData()|.
-static Position updatePositionAfterAdoptingTextReplacement(
-    const Position& position,
-    CharacterData* node,
-    unsigned offset,
-    unsigned oldLength,
-    unsigned newLength) {
-  if (position.anchorNode() != node)
-    return position;
-
-  if (position.isBeforeAnchor()) {
-    return updatePositionAfterAdoptingTextReplacement(
-        Position(node, 0), node, offset, oldLength, newLength);
-  }
-  if (position.isAfterAnchor()) {
-    return updatePositionAfterAdoptingTextReplacement(
-        Position(node, oldLength), node, offset, oldLength, newLength);
-  }
-
-  // See:
-  // http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Mutation
-  DCHECK_GE(position.offsetInContainerNode(), 0);
-  unsigned positionOffset =
-      static_cast<unsigned>(position.offsetInContainerNode());
-  // Replacing text can be viewed as a deletion followed by insertion.
-  if (positionOffset >= offset && positionOffset <= offset + oldLength)
-    positionOffset = offset;
-
-  // Adjust the offset if the position is after the end of the deleted contents
-  // (positionOffset > offset + oldLength) to avoid having a stale offset.
-  if (positionOffset > offset + oldLength)
-    positionOffset = positionOffset - oldLength + newLength;
-
-  // Due to case folding
-  // (http://unicode.org/Public/UCD/latest/ucd/CaseFolding.txt), LayoutText
-  // length may be different from Text length.  A correct implementation would
-  // translate the LayoutText offset to a Text offset; this is just a safety
-  // precaution to avoid offset values that run off the end of the Text.
-  if (positionOffset > node->length())
-    positionOffset = node->length();
-
-  return Position(node, positionOffset);
-}
-
-// TODO(yosin): We should move |didUpdateCharacterData()| to
-// "SelectionEditor.cpp".
-void SelectionEditor::didUpdateCharacterData(CharacterData* node,
-                                             unsigned offset,
-                                             unsigned oldLength,
-                                             unsigned newLength) {
-  // The fragment check is a performance optimization. See
-  // http://trac.webkit.org/changeset/30062.
-  if (m_selection.isNone() || !node || !node->isConnected()) {
-    didFinishDOMMutation();
-    return;
-  }
-  const Position& newBase = updatePositionAfterAdoptingTextReplacement(
-      m_selection.m_base, node, offset, oldLength, newLength);
-  const Position& newExtent = updatePositionAfterAdoptingTextReplacement(
-      m_selection.m_extent, node, offset, oldLength, newLength);
-  didFinishTextChange(newBase, newExtent);
-}
-
-// TODO(yosin): We should move |updatePostionAfterAdoptingTextNodesMerged()|
-// to "SelectionEditor.cpp" since it used only in
-// |SelectionEditor::didMergeTextNodes()|.
-// TODO(yosin): We should introduce |Position(const Text&, int)| to avoid
-// |const_cast<Text*>|.
-static Position updatePostionAfterAdoptingTextNodesMerged(
-    const Position& position,
-    const Text& mergedNode,
-    const NodeWithIndex& nodeToBeRemovedWithIndex,
-    unsigned oldLength) {
-  Node* const anchorNode = position.anchorNode();
-  const Node& nodeToBeRemoved = nodeToBeRemovedWithIndex.node();
-  switch (position.anchorType()) {
-    case PositionAnchorType::BeforeChildren:
-    case PositionAnchorType::AfterChildren:
-      return position;
-    case PositionAnchorType::BeforeAnchor:
-      if (anchorNode == nodeToBeRemoved)
-        return Position(const_cast<Text*>(&mergedNode), mergedNode.length());
-      return position;
-    case PositionAnchorType::AfterAnchor:
-      if (anchorNode == nodeToBeRemoved)
-        return Position(const_cast<Text*>(&mergedNode), mergedNode.length());
-      if (anchorNode == mergedNode)
-        return Position(const_cast<Text*>(&mergedNode), oldLength);
-      return position;
-    case PositionAnchorType::OffsetInAnchor: {
-      const int offset = position.offsetInContainerNode();
-      if (anchorNode == nodeToBeRemoved)
-        return Position(const_cast<Text*>(&mergedNode), oldLength + offset);
-      if (anchorNode == nodeToBeRemoved.parentNode() &&
-          offset == nodeToBeRemovedWithIndex.index()) {
-        return Position(const_cast<Text*>(&mergedNode), oldLength);
-      }
-      return position;
-    }
-  }
-  NOTREACHED() << position;
-  return position;
-}
-
-// TODO(yosin): We should move |SelectionEditor::didMergeTextNodes()| to
-// "SelectionEditor.cpp".
-void SelectionEditor::didMergeTextNodes(
-    const Text& mergedNode,
-    const NodeWithIndex& nodeToBeRemovedWithIndex,
-    unsigned oldLength) {
-  if (m_selection.isNone()) {
-    didFinishDOMMutation();
-    return;
-  }
-  const Position& newBase = updatePostionAfterAdoptingTextNodesMerged(
-      m_selection.m_base, mergedNode, nodeToBeRemovedWithIndex, oldLength);
-  const Position& newExtent = updatePostionAfterAdoptingTextNodesMerged(
-      m_selection.m_extent, mergedNode, nodeToBeRemovedWithIndex, oldLength);
-  didFinishTextChange(newBase, newExtent);
-}
-
-// TODO(yosin): We should move |updatePostionAfterAdoptingTextNodeSplit()|
-// to "SelectionEditor.cpp" since it used only in
-// |SelectionEditor::didSplitTextNode()|.
-static Position updatePostionAfterAdoptingTextNodeSplit(
-    const Position& position,
-    const Text& oldNode) {
-  if (!position.anchorNode() || position.anchorNode() != &oldNode ||
-      !position.isOffsetInAnchor())
-    return position;
-  // See:
-  // http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Mutation
-  DCHECK_GE(position.offsetInContainerNode(), 0);
-  unsigned positionOffset =
-      static_cast<unsigned>(position.offsetInContainerNode());
-  unsigned oldLength = oldNode.length();
-  if (positionOffset <= oldLength)
-    return position;
-  return Position(toText(oldNode.nextSibling()), positionOffset - oldLength);
-}
-
-// TODO(yosin): We should move |SelectionEditor::didSplitTextNode()| to
-// "SelectionEditor.cpp".
-void SelectionEditor::didSplitTextNode(const Text& oldNode) {
-  if (m_selection.isNone() || !oldNode.isConnected()) {
-    didFinishDOMMutation();
-    return;
-  }
-  const Position& newBase =
-      updatePostionAfterAdoptingTextNodeSplit(m_selection.m_base, oldNode);
-  const Position& newExtent =
-      updatePostionAfterAdoptingTextNodeSplit(m_selection.m_extent, oldNode);
-  didFinishTextChange(newBase, newExtent);
-}
-
 void FrameSelection::didChangeFocus() {
   // Hits in
   // virtual/gpu/compositedscrolling/scrollbars/scrollbar-miss-mousemove-disabled.html
@@ -729,7 +492,7 @@
 
   // Treat a collapsed selection like no selection.
   const VisibleSelectionInFlatTree& visibleSelection =
-      this->visibleSelection<EditingInFlatTreeStrategy>();
+      computeVisibleSelectionInFlatTree();
   if (!visibleSelection.isRange())
     return false;
 
@@ -1083,7 +846,7 @@
 static String extractSelectedText(const FrameSelection& selection,
                                   TextIteratorBehavior behavior) {
   const VisibleSelectionInFlatTree& visibleSelection =
-      selection.visibleSelection<EditingInFlatTreeStrategy>();
+      selection.computeVisibleSelectionInFlatTree();
   const EphemeralRangeInFlatTree& range =
       visibleSelection.toNormalizedEphemeralRange();
   // We remove '\0' characters because they are not visibly rendered to the
@@ -1093,7 +856,7 @@
 
 String FrameSelection::selectedHTMLForClipboard() const {
   const VisibleSelectionInFlatTree& visibleSelection =
-      this->visibleSelection<EditingInFlatTreeStrategy>();
+      computeVisibleSelectionInFlatTree();
   const EphemeralRangeInFlatTree& range =
       visibleSelection.toNormalizedEphemeralRange();
   return createMarkup(range.startPosition(), range.endPosition(),
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.h b/third_party/WebKit/Source/core/editing/FrameSelection.h
index ad429ce..1d74004 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.h
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.h
@@ -118,8 +118,6 @@
   // An implementation of |WebFrame::moveCaretSelection()|
   void moveCaretSelection(const IntPoint&);
 
-  template <typename Strategy>
-  const VisibleSelectionTemplate<Strategy>& visibleSelection() const;
   const VisibleSelection& computeVisibleSelectionInDOMTree() const;
   const VisibleSelectionInFlatTree& computeVisibleSelectionInFlatTree() const;
 
diff --git a/third_party/WebKit/Source/core/editing/PendingSelection.cpp b/third_party/WebKit/Source/core/editing/PendingSelection.cpp
index da2ae73..2a98762 100644
--- a/third_party/WebKit/Source/core/editing/PendingSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/PendingSelection.cpp
@@ -113,7 +113,7 @@
   m_hasPendingSelection = false;
 
   const VisibleSelectionInFlatTree& originalSelection =
-      m_frameSelection->visibleSelection<EditingInFlatTreeStrategy>();
+      m_frameSelection->computeVisibleSelectionInFlatTree();
 
   // Skip if pending VisibilePositions became invalid before we reach here.
   if (!isSelectionInDocument(originalSelection, layoutView.document()))
diff --git a/third_party/WebKit/Source/core/editing/SelectionController.cpp b/third_party/WebKit/Source/core/editing/SelectionController.cpp
index b57c8ab..5328509 100644
--- a/third_party/WebKit/Source/core/editing/SelectionController.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionController.cpp
@@ -175,7 +175,7 @@
                 PositionInFlatTree::firstPositionInOrBeforeNode(innerNode))
           : visibleHitPos;
   const VisibleSelectionInFlatTree& selection =
-      this->selection().visibleSelection<EditingInFlatTreeStrategy>();
+      this->selection().computeVisibleSelectionInFlatTree();
 
   // Don't restart the selection when the mouse is pressed on an
   // existing selection so we can allow for text dragging.
@@ -359,10 +359,7 @@
   // Special case to limit selection to the containing block for SVG text.
   // FIXME: Isn't there a better non-SVG-specific way to do this?
   if (Node* selectionBaseNode =
-          selection()
-              .visibleSelection<EditingInFlatTreeStrategy>()
-              .base()
-              .anchorNode()) {
+          selection().computeVisibleSelectionInFlatTree().base().anchorNode()) {
     if (LayoutObject* selectionBaseLayoutObject =
             selectionBaseNode->layoutObject()) {
       if (selectionBaseLayoutObject->isSVGText()) {
@@ -387,8 +384,7 @@
     m_selectionState = SelectionState::ExtendedSelection;
     basePosition = targetPosition.deepEquivalent();
   } else {
-    basePosition =
-        selection().visibleSelection<EditingInFlatTreeStrategy>().base();
+    basePosition = selection().computeVisibleSelectionInFlatTree().base();
   }
   const SelectionInFlatTree& appliedSelection = applySelectAll(
       basePosition, targetPosition.deepEquivalent(), mousePressNode,
@@ -674,7 +670,7 @@
     newSelection.setBase(newBase);
     newSelection.setExtent(newExtent);
   } else if (originalBase.isNotNull()) {
-    if (selection().visibleSelection<EditingInFlatTreeStrategy>().base() ==
+    if (selection().computeVisibleSelectionInFlatTree().base() ==
         newSelection.base())
       newSelection.setBase(originalBase);
     m_originalBaseInFlatTree = VisiblePositionInFlatTree();
@@ -683,8 +679,7 @@
   // Adjusting base and extent will make newSelection always directional
   newSelection.setIsDirectional(isDirectional);
   const bool isHandleVisible = handleVisibility == HandleVisibility::Visible;
-  if (selection().visibleSelection<EditingInFlatTreeStrategy>() ==
-          newSelection &&
+  if (selection().computeVisibleSelectionInFlatTree() == newSelection &&
       selection().isHandleVisible() == isHandleVisible)
     return;
 
@@ -872,7 +867,7 @@
         builder.collapse(pos.toPositionWithAffinity());
     }
 
-    if (selection().visibleSelection<EditingInFlatTreeStrategy>() !=
+    if (selection().computeVisibleSelectionInFlatTree() !=
         createVisibleSelection(builder.build())) {
       selection().setSelection(builder.build());
     }
diff --git a/third_party/WebKit/Source/core/editing/SelectionEditor.cpp b/third_party/WebKit/Source/core/editing/SelectionEditor.cpp
index 3cbe4ec..3835d067 100644
--- a/third_party/WebKit/Source/core/editing/SelectionEditor.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionEditor.cpp
@@ -178,6 +178,199 @@
   m_cacheIsDirty = false;
 }
 
+static Position computePositionForChildrenRemoval(const Position& position,
+                                                  ContainerNode& container) {
+  Node* node = position.computeContainerNode();
+  if (container.containsIncludingHostElements(*node))
+    return Position::firstPositionInNode(&container);
+  return position;
+}
+
+void SelectionEditor::nodeChildrenWillBeRemoved(ContainerNode& container) {
+  if (m_selection.isNone())
+    return;
+  const Position oldBase = m_selection.m_base;
+  const Position oldExtent = m_selection.m_extent;
+  const Position& newBase =
+      computePositionForChildrenRemoval(oldBase, container);
+  const Position& newExtent =
+      computePositionForChildrenRemoval(oldExtent, container);
+  if (newBase == oldBase && newExtent == oldExtent)
+    return;
+  m_selection = SelectionInDOMTree::Builder()
+                    .setBaseAndExtent(newBase, newExtent)
+                    .build();
+  markCacheDirty();
+}
+
+static Position computePositionForNodeRemoval(const Position& position,
+                                              Node& nodeToBeRemoved) {
+  Position result = position;
+  // TODO(yosin): We should rename |updatePositionForNodeRemoval()|
+  // to |computePositionForNodeRemoval()| to avoid using output parameter.
+  updatePositionForNodeRemoval(result, nodeToBeRemoved);
+  return result;
+}
+
+void SelectionEditor::nodeWillBeRemoved(Node& nodeToBeRemoved) {
+  if (m_selection.isNone())
+    return;
+  const Position oldBase = m_selection.m_base;
+  const Position oldExtent = m_selection.m_extent;
+  const Position& newBase =
+      computePositionForNodeRemoval(oldBase, nodeToBeRemoved);
+  const Position& newExtent =
+      computePositionForNodeRemoval(oldExtent, nodeToBeRemoved);
+  if (newBase == oldBase && newExtent == oldExtent)
+    return;
+  m_selection = SelectionInDOMTree::Builder()
+                    .setBaseAndExtent(newBase, newExtent)
+                    .build();
+  markCacheDirty();
+}
+
+static Position updatePositionAfterAdoptingTextReplacement(
+    const Position& position,
+    CharacterData* node,
+    unsigned offset,
+    unsigned oldLength,
+    unsigned newLength) {
+  if (position.anchorNode() != node)
+    return position;
+
+  if (position.isBeforeAnchor()) {
+    return updatePositionAfterAdoptingTextReplacement(
+        Position(node, 0), node, offset, oldLength, newLength);
+  }
+  if (position.isAfterAnchor()) {
+    return updatePositionAfterAdoptingTextReplacement(
+        Position(node, oldLength), node, offset, oldLength, newLength);
+  }
+
+  // See:
+  // http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Mutation
+  DCHECK_GE(position.offsetInContainerNode(), 0);
+  unsigned positionOffset =
+      static_cast<unsigned>(position.offsetInContainerNode());
+  // Replacing text can be viewed as a deletion followed by insertion.
+  if (positionOffset >= offset && positionOffset <= offset + oldLength)
+    positionOffset = offset;
+
+  // Adjust the offset if the position is after the end of the deleted contents
+  // (positionOffset > offset + oldLength) to avoid having a stale offset.
+  if (positionOffset > offset + oldLength)
+    positionOffset = positionOffset - oldLength + newLength;
+
+  // Due to case folding
+  // (http://unicode.org/Public/UCD/latest/ucd/CaseFolding.txt), LayoutText
+  // length may be different from Text length.  A correct implementation would
+  // translate the LayoutText offset to a Text offset; this is just a safety
+  // precaution to avoid offset values that run off the end of the Text.
+  if (positionOffset > node->length())
+    positionOffset = node->length();
+
+  return Position(node, positionOffset);
+}
+
+void SelectionEditor::didUpdateCharacterData(CharacterData* node,
+                                             unsigned offset,
+                                             unsigned oldLength,
+                                             unsigned newLength) {
+  // The fragment check is a performance optimization. See
+  // http://trac.webkit.org/changeset/30062.
+  if (m_selection.isNone() || !node || !node->isConnected()) {
+    didFinishDOMMutation();
+    return;
+  }
+  const Position& newBase = updatePositionAfterAdoptingTextReplacement(
+      m_selection.m_base, node, offset, oldLength, newLength);
+  const Position& newExtent = updatePositionAfterAdoptingTextReplacement(
+      m_selection.m_extent, node, offset, oldLength, newLength);
+  didFinishTextChange(newBase, newExtent);
+}
+
+// TODO(yosin): We should introduce |Position(const Text&, int)| to avoid
+// |const_cast<Text*>|.
+static Position updatePostionAfterAdoptingTextNodesMerged(
+    const Position& position,
+    const Text& mergedNode,
+    const NodeWithIndex& nodeToBeRemovedWithIndex,
+    unsigned oldLength) {
+  Node* const anchorNode = position.anchorNode();
+  const Node& nodeToBeRemoved = nodeToBeRemovedWithIndex.node();
+  switch (position.anchorType()) {
+    case PositionAnchorType::BeforeChildren:
+    case PositionAnchorType::AfterChildren:
+      return position;
+    case PositionAnchorType::BeforeAnchor:
+      if (anchorNode == nodeToBeRemoved)
+        return Position(const_cast<Text*>(&mergedNode), mergedNode.length());
+      return position;
+    case PositionAnchorType::AfterAnchor:
+      if (anchorNode == nodeToBeRemoved)
+        return Position(const_cast<Text*>(&mergedNode), mergedNode.length());
+      if (anchorNode == mergedNode)
+        return Position(const_cast<Text*>(&mergedNode), oldLength);
+      return position;
+    case PositionAnchorType::OffsetInAnchor: {
+      const int offset = position.offsetInContainerNode();
+      if (anchorNode == nodeToBeRemoved)
+        return Position(const_cast<Text*>(&mergedNode), oldLength + offset);
+      if (anchorNode == nodeToBeRemoved.parentNode() &&
+          offset == nodeToBeRemovedWithIndex.index()) {
+        return Position(const_cast<Text*>(&mergedNode), oldLength);
+      }
+      return position;
+    }
+  }
+  NOTREACHED() << position;
+  return position;
+}
+
+void SelectionEditor::didMergeTextNodes(
+    const Text& mergedNode,
+    const NodeWithIndex& nodeToBeRemovedWithIndex,
+    unsigned oldLength) {
+  if (m_selection.isNone()) {
+    didFinishDOMMutation();
+    return;
+  }
+  const Position& newBase = updatePostionAfterAdoptingTextNodesMerged(
+      m_selection.m_base, mergedNode, nodeToBeRemovedWithIndex, oldLength);
+  const Position& newExtent = updatePostionAfterAdoptingTextNodesMerged(
+      m_selection.m_extent, mergedNode, nodeToBeRemovedWithIndex, oldLength);
+  didFinishTextChange(newBase, newExtent);
+}
+
+static Position updatePostionAfterAdoptingTextNodeSplit(
+    const Position& position,
+    const Text& oldNode) {
+  if (!position.anchorNode() || position.anchorNode() != &oldNode ||
+      !position.isOffsetInAnchor())
+    return position;
+  // See:
+  // http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Mutation
+  DCHECK_GE(position.offsetInContainerNode(), 0);
+  unsigned positionOffset =
+      static_cast<unsigned>(position.offsetInContainerNode());
+  unsigned oldLength = oldNode.length();
+  if (positionOffset <= oldLength)
+    return position;
+  return Position(toText(oldNode.nextSibling()), positionOffset - oldLength);
+}
+
+void SelectionEditor::didSplitTextNode(const Text& oldNode) {
+  if (m_selection.isNone() || !oldNode.isConnected()) {
+    didFinishDOMMutation();
+    return;
+  }
+  const Position& newBase =
+      updatePostionAfterAdoptingTextNodeSplit(m_selection.m_base, oldNode);
+  const Position& newExtent =
+      updatePostionAfterAdoptingTextNodeSplit(m_selection.m_extent, oldNode);
+  didFinishTextChange(newBase, newExtent);
+}
+
 void SelectionEditor::resetLogicalRange() {
   // Non-collapsed ranges are not allowed to start at the end of a line that
   // is wrapped, they start at the beginning of the next line instead
diff --git a/third_party/WebKit/Source/core/frame/Deprecation.cpp b/third_party/WebKit/Source/core/frame/Deprecation.cpp
index 79bdd6a..86fb5c4 100644
--- a/third_party/WebKit/Source/core/frame/Deprecation.cpp
+++ b/third_party/WebKit/Source/core/frame/Deprecation.cpp
@@ -418,10 +418,10 @@
       return willBeRemoved("\"zoom: document\"", M59, "4997605029314560");
 
     case UseCounter::SelectionAddRangeIntersect:
-      return willBeRemoved(
-          "The behavior that Selection.addRange() merges existing Range and "
-          "the specified Range",
-          M58, "6680566019653632");
+      return "The behavior that Selection.addRange() merges existing Range and "
+             "the specified Range was removed. See "
+             "https://www.chromestatus.com/features/6680566019653632 for more "
+             "details.";
 
     // Features that aren't deprecated don't have a deprecation message.
     default:
diff --git a/third_party/WebKit/Source/core/loader/BUILD.gn b/third_party/WebKit/Source/core/loader/BUILD.gn
index e0e57be8..be6e6a63 100644
--- a/third_party/WebKit/Source/core/loader/BUILD.gn
+++ b/third_party/WebKit/Source/core/loader/BUILD.gn
@@ -7,7 +7,6 @@
 blink_core_sources("loader") {
   sources = [
     "CookieJar.cpp",
-    "CrossOriginPreflightResultCache.cpp",
     "DocumentLoadTiming.cpp",
     "DocumentLoader.cpp",
     "DocumentThreadableLoader.cpp",
@@ -17,8 +16,6 @@
     "EmptyClients.cpp",
     "EmptyClients.h",
     "FormSubmission.cpp",
-    "FrameClientHintsPreferencesContext.cpp",
-    "FrameClientHintsPreferencesContext.h",
     "FrameFetchContext.cpp",
     "FrameFetchContext.h",
     "FrameLoadRequest.cpp",
@@ -41,8 +38,6 @@
     "NavigationScheduler.cpp",
     "PingLoader.cpp",
     "PingLoader.h",
-    "PrerenderHandle.cpp",
-    "PrerenderHandle.h",
     "PrerendererClient.cpp",
     "PrerendererClient.h",
     "ProgressTracker.cpp",
@@ -63,6 +58,12 @@
     "appcache/ApplicationCacheHost.cpp",
     "appcache/ApplicationCacheHost.h",
     "modulescript/ModuleScriptFetchRequest.h",
+    "private/CrossOriginPreflightResultCache.cpp",
+    "private/CrossOriginPreflightResultCache.h",
+    "private/FrameClientHintsPreferencesContext.cpp",
+    "private/FrameClientHintsPreferencesContext.h",
+    "private/PrerenderHandle.cpp",
+    "private/PrerenderHandle.h",
     "resource/CSSStyleSheetResource.cpp",
     "resource/CSSStyleSheetResource.h",
     "resource/DocumentResource.cpp",
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
index 450a12e..468915d 100644
--- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -31,17 +31,18 @@
 
 #include "core/loader/DocumentThreadableLoader.h"
 
+#include <memory>
 #include "core/dom/Document.h"
 #include "core/dom/TaskRunnerHelper.h"
 #include "core/frame/FrameConsole.h"
 #include "core/frame/LocalFrame.h"
 #include "core/inspector/InspectorInstrumentation.h"
 #include "core/inspector/InspectorTraceEvents.h"
-#include "core/loader/CrossOriginPreflightResultCache.h"
 #include "core/loader/DocumentThreadableLoaderClient.h"
 #include "core/loader/FrameLoader.h"
 #include "core/loader/FrameLoaderClient.h"
 #include "core/loader/ThreadableLoaderClient.h"
+#include "core/loader/private/CrossOriginPreflightResultCache.h"
 #include "core/page/ChromeClient.h"
 #include "core/page/Page.h"
 #include "platform/SharedBuffer.h"
@@ -59,7 +60,6 @@
 #include "wtf/Assertions.h"
 #include "wtf/PtrUtil.h"
 #include "wtf/WeakPtr.h"
-#include <memory>
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
index 607cefdf..e301c9d 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
@@ -30,6 +30,8 @@
 
 #include "core/loader/FrameFetchContext.h"
 
+#include <algorithm>
+#include <memory>
 #include "bindings/core/v8/ScriptController.h"
 #include "bindings/core/v8/V8DOMActivityLogger.h"
 #include "core/dom/Document.h"
@@ -49,7 +51,6 @@
 #include "core/inspector/InspectorNetworkAgent.h"
 #include "core/inspector/InspectorTraceEvents.h"
 #include "core/loader/DocumentLoader.h"
-#include "core/loader/FrameClientHintsPreferencesContext.h"
 #include "core/loader/FrameLoader.h"
 #include "core/loader/FrameLoaderClient.h"
 #include "core/loader/MixedContentChecker.h"
@@ -57,6 +58,7 @@
 #include "core/loader/PingLoader.h"
 #include "core/loader/ProgressTracker.h"
 #include "core/loader/appcache/ApplicationCacheHost.h"
+#include "core/loader/private/FrameClientHintsPreferencesContext.h"
 #include "core/page/NetworkStateNotifier.h"
 #include "core/page/Page.h"
 #include "core/paint/FirstMeaningfulPaintDetector.h"
@@ -81,8 +83,6 @@
 #include "public/platform/WebInsecureRequestPolicy.h"
 #include "public/platform/WebViewScheduler.h"
 #include "wtf/Vector.h"
-#include <algorithm>
-#include <memory>
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/loader/HttpEquiv.cpp b/third_party/WebKit/Source/core/loader/HttpEquiv.cpp
index ec4fdffa..48c065cf 100644
--- a/third_party/WebKit/Source/core/loader/HttpEquiv.cpp
+++ b/third_party/WebKit/Source/core/loader/HttpEquiv.cpp
@@ -12,7 +12,7 @@
 #include "core/frame/csp/ContentSecurityPolicy.h"
 #include "core/inspector/ConsoleMessage.h"
 #include "core/loader/DocumentLoader.h"
-#include "core/loader/FrameClientHintsPreferencesContext.h"
+#include "core/loader/private/FrameClientHintsPreferencesContext.h"
 #include "core/origin_trials/OriginTrialContext.h"
 #include "platform/HTTPNames.h"
 #include "platform/loader/fetch/ClientHintsPreferences.h"
diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.cpp b/third_party/WebKit/Source/core/loader/LinkLoader.cpp
index 4110e69..5ec5519 100644
--- a/third_party/WebKit/Source/core/loader/LinkLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/LinkLoader.cpp
@@ -42,7 +42,7 @@
 #include "core/inspector/ConsoleMessage.h"
 #include "core/loader/DocumentLoader.h"
 #include "core/loader/NetworkHintsInterface.h"
-#include "core/loader/PrerenderHandle.h"
+#include "core/loader/private/PrerenderHandle.h"
 #include "core/loader/resource/LinkFetchResource.h"
 #include "platform/Prerender.h"
 #include "platform/RuntimeEnabledFeatures.h"
diff --git a/third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.cpp b/third_party/WebKit/Source/core/loader/private/CrossOriginPreflightResultCache.cpp
similarity index 98%
rename from third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.cpp
rename to third_party/WebKit/Source/core/loader/private/CrossOriginPreflightResultCache.cpp
index 513e453..1bb251f 100644
--- a/third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.cpp
+++ b/third_party/WebKit/Source/core/loader/private/CrossOriginPreflightResultCache.cpp
@@ -24,14 +24,14 @@
  *
  */
 
-#include "core/loader/CrossOriginPreflightResultCache.h"
+#include "core/loader/private/CrossOriginPreflightResultCache.h"
 
+#include <memory>
 #include "platform/HTTPNames.h"
 #include "platform/loader/fetch/FetchUtils.h"
 #include "platform/network/ResourceResponse.h"
 #include "wtf/CurrentTime.h"
 #include "wtf/StdLibExtras.h"
-#include <memory>
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.h b/third_party/WebKit/Source/core/loader/private/CrossOriginPreflightResultCache.h
similarity index 99%
rename from third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.h
rename to third_party/WebKit/Source/core/loader/private/CrossOriginPreflightResultCache.h
index 1fa930e2..46a8445 100644
--- a/third_party/WebKit/Source/core/loader/CrossOriginPreflightResultCache.h
+++ b/third_party/WebKit/Source/core/loader/private/CrossOriginPreflightResultCache.h
@@ -27,12 +27,12 @@
 #ifndef CrossOriginPreflightResultCache_h
 #define CrossOriginPreflightResultCache_h
 
+#include <memory>
 #include "platform/loader/fetch/ResourceLoaderOptions.h"
 #include "platform/weborigin/KURLHash.h"
 #include "wtf/HashMap.h"
 #include "wtf/HashSet.h"
 #include "wtf/text/StringHash.h"
-#include <memory>
 
 namespace blink {
 
diff --git a/third_party/WebKit/Source/core/loader/FrameClientHintsPreferencesContext.cpp b/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.cpp
similarity index 91%
rename from third_party/WebKit/Source/core/loader/FrameClientHintsPreferencesContext.cpp
rename to third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.cpp
index 69ad42a..eca90359 100644
--- a/third_party/WebKit/Source/core/loader/FrameClientHintsPreferencesContext.cpp
+++ b/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/loader/FrameClientHintsPreferencesContext.h"
+#include "core/loader/private/FrameClientHintsPreferencesContext.h"
 
 #include "core/frame/UseCounter.h"
 
diff --git a/third_party/WebKit/Source/core/loader/FrameClientHintsPreferencesContext.h b/third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.h
similarity index 100%
rename from third_party/WebKit/Source/core/loader/FrameClientHintsPreferencesContext.h
rename to third_party/WebKit/Source/core/loader/private/FrameClientHintsPreferencesContext.h
diff --git a/third_party/WebKit/Source/core/loader/PrerenderHandle.cpp b/third_party/WebKit/Source/core/loader/private/PrerenderHandle.cpp
similarity index 98%
rename from third_party/WebKit/Source/core/loader/PrerenderHandle.cpp
rename to third_party/WebKit/Source/core/loader/private/PrerenderHandle.cpp
index bf8f608..2124803 100644
--- a/third_party/WebKit/Source/core/loader/PrerenderHandle.cpp
+++ b/third_party/WebKit/Source/core/loader/private/PrerenderHandle.cpp
@@ -28,7 +28,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "core/loader/PrerenderHandle.h"
+#include "core/loader/private/PrerenderHandle.h"
 
 #include "core/dom/Document.h"
 #include "core/frame/LocalFrame.h"
diff --git a/third_party/WebKit/Source/core/loader/PrerenderHandle.h b/third_party/WebKit/Source/core/loader/private/PrerenderHandle.h
similarity index 100%
rename from third_party/WebKit/Source/core/loader/PrerenderHandle.h
rename to third_party/WebKit/Source/core/loader/private/PrerenderHandle.h
diff --git a/third_party/WebKit/Source/platform/heap/Persistent.h b/third_party/WebKit/Source/platform/heap/Persistent.h
index 2527ce0..0f9e0a5 100644
--- a/third_party/WebKit/Source/platform/heap/Persistent.h
+++ b/third_party/WebKit/Source/platform/heap/Persistent.h
@@ -262,18 +262,6 @@
         DCHECK_EQ(&current->heap(), &m_creationThreadState->heap());
       }
     }
-
-#if defined(ADDRESS_SANITIZER)
-    // ThreadHeap::isHeapObjectAlive(m_raw) checks that m_raw is a traceable
-    // object. In other words, it checks that the pointer is either of:
-    //
-    //   (a) a pointer to the head of an on-heap object.
-    //   (b) a pointer to the head of an on-heap mixin object.
-    //
-    // Otherwise, ThreadHeap::isHeapObjectAlive will crash when it calls
-    // header->checkHeader().
-    ThreadHeap::isHeapObjectAlive(m_raw);
-#endif
 #endif
   }