diff --git a/BUILD.gn b/BUILD.gn
index 5f42fa9d..e8b26f5 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -314,6 +314,7 @@
       "//third_party/WebKit/Source/wtf:wtf_unittests",
       "//third_party/angle/src/tests:angle_end2end_tests",
       "//third_party/angle/src/tests:angle_unittests",
+      "//third_party/angle/src/tests:angle_white_box_tests",
       "//third_party/catapult/telemetry:bitmaptools($host_toolchain)",
       "//third_party/smhasher:pmurhash",
       "//tools/imagediff($host_toolchain)",
@@ -970,6 +971,10 @@
       "$root_build_dir/resources/inspector/",
     ]
 
+    if (is_win) {
+      data += [ "//third_party/apache-win32/" ]
+    }
+
     if (is_android) {
       data += [
         "//third_party/catapult/",
diff --git a/DEPS b/DEPS
index c4f5f5b..7b45eea 100644
--- a/DEPS
+++ b/DEPS
@@ -40,11 +40,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '394d414452a5d654731b0b5a3669f8e2420048b3',
+  'skia_revision': '8729e5bbf7c436fd7c7c13182adbbfb419f566b5',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'ec3ce5bd4cb614d3c7245ffd282a426ef9672e12',
+  'v8_revision': '547f4de8ab3155d315bba833a95924e063b94a33',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -64,7 +64,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '4093039d19f832173ec58cfd9f2e8ac393a76091',
+  'pdfium_revision': 'a4ad01fe03ffdd1806d31a9d7bb820f6a69a0afb',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
diff --git a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
index 4be4b4c..b87586f 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwBrowserContext.java
@@ -9,7 +9,6 @@
 
 import org.chromium.components.safe_browsing.SafeBrowsingApiBridge;
 import org.chromium.components.safe_browsing.SafeBrowsingApiHandler;
-import org.chromium.content.browser.AppWebMessagePortService;
 import org.chromium.content.browser.ContentViewStatics;
 
 /**
@@ -26,7 +25,6 @@
 
     private AwGeolocationPermissions mGeolocationPermissions;
     private AwFormDatabase mFormDatabase;
-    private AppWebMessagePortService mMessagePortService;
     private AwServiceWorkerController mServiceWorkerController;
     private Context mApplicationContext;
 
@@ -53,13 +51,6 @@
         return mFormDatabase;
     }
 
-    public AppWebMessagePortService getMessagePortService() {
-        if (mMessagePortService == null) {
-            mMessagePortService = new AppWebMessagePortService();
-        }
-        return mMessagePortService;
-    }
-
     public AwServiceWorkerController getServiceWorkerController() {
         if (mServiceWorkerController == null) {
             mServiceWorkerController = new AwServiceWorkerController(mApplicationContext, this);
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 83b9150..6c64c0b 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -58,11 +58,9 @@
 import org.chromium.components.navigation_interception.InterceptNavigationDelegate;
 import org.chromium.components.navigation_interception.NavigationParams;
 import org.chromium.content.browser.AppWebMessagePort;
-import org.chromium.content.browser.AppWebMessagePortService;
 import org.chromium.content.browser.ContentViewClient;
 import org.chromium.content.browser.ContentViewCore;
 import org.chromium.content.browser.ContentViewStatics;
-import org.chromium.content.browser.PostMessageSender;
 import org.chromium.content.browser.SmartClipProvider;
 import org.chromium.content_public.browser.GestureStateListener;
 import org.chromium.content_public.browser.JavaScriptCallback;
@@ -100,7 +98,7 @@
  * continuous build & test in the open source SDK-based tree).
  */
 @JNINamespace("android_webview")
-public class AwContents implements SmartClipProvider, PostMessageSender.PostMessageSenderDelegate {
+public class AwContents implements SmartClipProvider {
     private static final String TAG = "AwContents";
     private static final boolean TRACE = false;
     private static final int NO_WARN = 0;
@@ -339,8 +337,6 @@
     private AwViewMethods mAwViewMethods;
     private final FullScreenTransitionsState mFullScreenTransitionsState;
 
-    private PostMessageSender mPostMessageSender;
-
     // This flag indicates that ShouldOverrideUrlNavigation should be posted
     // through the resourcethrottle. This is only used for popup windows.
     private boolean mDeferredShouldOverrideUrlLoadingIsPendingForPopup;
@@ -1198,11 +1194,6 @@
         // Remove pending messages
         mContentsClient.getCallbackHelper().removeCallbacksAndMessages();
 
-        if  (mPostMessageSender != null) {
-            mBrowserContext.getMessagePortService().removeObserver(mPostMessageSender);
-            mPostMessageSender = null;
-        }
-
         if (mIsAttachedToWindow) {
             Log.w(TAG, "WebView.destroy() called while WebView is still attached to window.");
             // Need to call detach to avoid leaks because the real detach later will be ignored.
@@ -2285,33 +2276,17 @@
     public void postMessageToFrame(
             String frameName, String message, String targetOrigin, MessagePort[] sentPorts) {
         if (isDestroyedOrNoOperation(WARN)) return;
-        if (mPostMessageSender == null) {
-            AppWebMessagePortService service = mBrowserContext.getMessagePortService();
-            mPostMessageSender = new PostMessageSender(this, service);
-            service.addObserver(mPostMessageSender);
+        if (sentPorts != null) {
+            for (MessagePort port : sentPorts) {
+                if (port.isClosed() || port.isTransferred()) {
+                    throw new IllegalStateException("Port is already closed or transferred");
+                }
+                if (port.isStarted()) {
+                    throw new IllegalStateException("Port is already started");
+                }
+            }
         }
-        mPostMessageSender.postMessage(frameName, message, targetOrigin,
-                (AppWebMessagePort[]) sentPorts);
-    }
-
-    // Implements PostMessageSender.PostMessageSenderDelegate interface method.
-    @Override
-    public boolean isPostMessageSenderReady() {
-        return true;
-    }
-
-    // Implements PostMessageSender.PostMessageSenderDelegate interface method.
-    @Override
-    public void onPostMessageQueueEmpty() { }
-
-    // Implements PostMessageSender.PostMessageSenderDelegate interface method.
-    @Override
-    public void postMessageToWeb(String frameName, String message, String targetOrigin,
-            int[] sentPortIds) {
-        if (TRACE) Log.i(TAG, "%s postMessageToWeb. TargetOrigin=%s", this, targetOrigin);
-        if (isDestroyedOrNoOperation(NO_WARN)) return;
-        nativePostMessageToFrame(mNativeAwContents, frameName, message, targetOrigin,
-                sentPortIds);
+        nativePostMessageToFrame(mNativeAwContents, frameName, message, targetOrigin, sentPorts);
     }
 
     /**
@@ -2320,9 +2295,7 @@
     public AppWebMessagePort[] createMessageChannel() {
         if (TRACE) Log.i(TAG, "%s createMessageChannel", this);
         if (isDestroyedOrNoOperation(WARN)) return null;
-        AppWebMessagePort[] ports = mBrowserContext.getMessagePortService().createMessageChannel();
-        nativeCreateMessageChannel(mNativeAwContents, ports);
-        return ports;
+        return AppWebMessagePort.createPair();
     }
 
     public boolean hasAccessedInitialDocument() {
@@ -3449,10 +3422,7 @@
             long resources);
 
     private native void nativePostMessageToFrame(long nativeAwContents, String frameId,
-            String message, String targetOrigin, int[] msgPorts);
-
-    private native void nativeCreateMessageChannel(
-            long nativeAwContents, AppWebMessagePort[] ports);
+            String message, String targetOrigin, MessagePort[] ports);
 
     private native void nativeGrantFileSchemeAccesstoChildProcess(long nativeAwContents);
     private native void nativeResumeLoadingCreatedPopupWebContents(long nativeAwContents);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
index 0adff6714..35743a3 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
@@ -6,7 +6,6 @@
 
 import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
 
-import android.os.Handler;
 import android.support.test.filters.SmallTest;
 import android.webkit.JavascriptInterface;
 
@@ -18,7 +17,6 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.content.browser.AppWebMessagePort;
-import org.chromium.content.browser.AppWebMessagePortService;
 import org.chromium.content.browser.test.util.Criteria;
 import org.chromium.content.browser.test.util.CriteriaHelper;
 import org.chromium.content.browser.test.util.TestCallbackHelperContainer.OnPageFinishedHelper;
@@ -501,8 +499,6 @@
     @Feature({"AndroidWebView", "Android-PostMessage"})
     public void testPendingPortCanBeTransferredInPendingPort() throws Throwable {
         loadPage(TITLE_FROM_POSTMESSAGE_TO_CHANNEL);
-        final TestMessagePort testPort =
-                new TestMessagePort(getAwBrowserContext().getMessagePortService());
         runTestOnUiThread(new Runnable() {
             @Override
             public void run() {
@@ -802,87 +798,6 @@
         expectTitle("24");
     }
 
-    private static class TestMessagePort extends AppWebMessagePort {
-        private boolean mReady;
-        private AppWebMessagePort mPort;
-        private final Object mLock = new Object();
-
-        public TestMessagePort(AppWebMessagePortService service) {
-            super(service);
-        }
-
-        public void setMessagePort(AppWebMessagePort port) {
-            mPort = port;
-        }
-
-        public void setReady(boolean ready) {
-            synchronized (mLock) {
-                mReady = ready;
-            }
-        }
-        @Override
-        public boolean isReady() {
-            synchronized (mLock) {
-                return mReady;
-            }
-        }
-        @Override
-        public int portId() {
-            return mPort.portId();
-        }
-        @Override
-        public void setPortId(int id) {
-            mPort.setPortId(id);
-        }
-        @Override
-        public void close() {
-            mPort.close();
-        }
-        @Override
-        public boolean isClosed() {
-            return mPort.isClosed();
-        }
-        @Override
-        public void setMessageCallback(MessageCallback messageCallback, Handler handler) {
-            mPort.setMessageCallback(messageCallback, handler);
-        }
-        @Override
-        public void onMessage(String message, AppWebMessagePort[] sentPorts) {
-            mPort.onMessage(message, sentPorts);
-        }
-        @Override
-        public void postMessage(String message, MessagePort[] sentPorts)
-                throws IllegalStateException {
-            mPort.postMessage(message, sentPorts);
-        }
-    }
-
-    // Post a message with a pending port to a frame and then post a message that
-    // is pending after that. Make sure that when first message becomes ready,
-    // the subsequent not-ready message is not sent.
-    @SmallTest
-    @Feature({"AndroidWebView", "Android-PostMessage"})
-    public void testPostMessageToFrameNotSendsPendingMessages() throws Throwable {
-        loadPage(TITLE_FROM_POSTMESSAGE_TO_FRAME);
-        final TestMessagePort testPort =
-                new TestMessagePort(getAwBrowserContext().getMessagePortService());
-        runTestOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                AppWebMessagePort[] channel = mAwContents.createMessageChannel();
-                mAwContents.postMessageToFrame(
-                        null, "1", mWebServer.getBaseUrl(), new AppWebMessagePort[] {channel[1]});
-                mAwContents.postMessageToFrame(null, "2", mWebServer.getBaseUrl(), null);
-                AppWebMessagePort[] channel2 = mAwContents.createMessageChannel();
-                // Test port is in a pending state so it should not be transferred.
-                testPort.setMessagePort(channel2[0]);
-                mAwContents.postMessageToFrame(
-                        null, "3", mWebServer.getBaseUrl(), new AppWebMessagePort[] {testPort});
-            }
-        });
-        expectTitle("12");
-    }
-
     private static final String WORKER_MESSAGE = "from_worker";
 
     // Listen for messages. Pass port 1 to worker and use port 2 to receive messages from
diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc
index 050d715..78d8d1de 100644
--- a/android_webview/native/aw_contents.cc
+++ b/android_webview/native/aw_contents.cc
@@ -56,7 +56,6 @@
 #include "components/autofill/core/browser/autofill_manager.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/navigation_interception/intercept_navigation_delegate.h"
-#include "content/public/browser/android/app_web_message_port_service.h"
 #include "content/public/browser/android/content_view_core.h"
 #include "content/public/browser/android/synchronous_compositor.h"
 #include "content/public/browser/browser_thread.h"
@@ -1334,28 +1333,14 @@
                                     const JavaParamRef<jstring>& frame_name,
                                     const JavaParamRef<jstring>& message,
                                     const JavaParamRef<jstring>& target_origin,
-                                    const JavaParamRef<jintArray>& sent_ports) {
+                                    const JavaParamRef<jobjectArray>& ports) {
   // Use an empty source origin for android webview.
-  base::string16 source_origin;
-  base::string16 j_target_origin(ConvertJavaStringToUTF16(env, target_origin));
-  base::string16 j_message(ConvertJavaStringToUTF16(env, message));
-  std::vector<int> j_ports;
-
-  if (sent_ports != nullptr)
-    base::android::JavaIntArrayToIntVector(env, sent_ports, &j_ports);
-
   content::MessagePortProvider::PostMessageToFrame(web_contents_.get(),
-                                                   source_origin,
-                                                   j_target_origin,
-                                                   j_message,
-                                                   j_ports);
-}
-
-void AwContents::CreateMessageChannel(JNIEnv* env,
-                                      const JavaParamRef<jobject>& obj,
-                                      const JavaParamRef<jobjectArray>& ports) {
-  content::MessagePortProvider::GetAppWebMessagePortService()
-      ->CreateMessageChannel(env, ports, web_contents_.get());
+                                                   env,
+                                                   nullptr,
+                                                   target_origin,
+                                                   message,
+                                                   ports);
 }
 
 void AwContents::GrantFileSchemeAccesstoChildProcess(
diff --git a/android_webview/native/aw_contents.h b/android_webview/native/aw_contents.h
index fefaefb4..e2e3cc63 100644
--- a/android_webview/native/aw_contents.h
+++ b/android_webview/native/aw_contents.h
@@ -342,10 +342,6 @@
       const base::android::JavaParamRef<jstring>& frame_id,
       const base::android::JavaParamRef<jstring>& message,
       const base::android::JavaParamRef<jstring>& target_origin,
-      const base::android::JavaParamRef<jintArray>& sent_ports);
-  void CreateMessageChannel(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobjectArray>& ports);
 
   void GrantFileSchemeAccesstoChildProcess(
diff --git a/ash/common/system/tray/tray_popup_item_style.cc b/ash/common/system/tray/tray_popup_item_style.cc
index 50d822c..ee5a8ce 100644
--- a/ash/common/system/tray/tray_popup_item_style.cc
+++ b/ash/common/system/tray/tray_popup_item_style.cc
@@ -8,6 +8,7 @@
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/font.h"
 #include "ui/gfx/font_list.h"
+#include "ui/native_theme/native_theme.h"
 #include "ui/views/controls/label.h"
 
 namespace ash {
@@ -79,6 +80,8 @@
     case FontStyle::SUB_HEADER:
       label->SetFontList(base_font_list.Derive(1, gfx::Font::NORMAL,
                                                gfx::Font::Weight::MEDIUM));
+      label->SetEnabledColor(label->GetNativeTheme()->GetSystemColor(
+          ui::NativeTheme::kColorId_ProminentButtonColor));
       label->SetAutoColorReadabilityEnabled(false);
       break;
     case FontStyle::DETAILED_VIEW_LABEL:
diff --git a/base/base_switches.cc b/base/base_switches.cc
index f5c6eb3..e8aa5cb 100644
--- a/base/base_switches.cc
+++ b/base/base_switches.cc
@@ -24,6 +24,12 @@
 // derived from trace events are reported.
 const char kEnableHeapProfilingModeNative[] = "native";
 
+// Report per-task heap usage and churn in the task profiler.
+// Does not keep track of individual allocations unlike the default and native
+// mode. Keeps only track of summarized churn stats in the task profiler
+// (chrome://profiler).
+const char kEnableHeapProfilingTaskProfiler[] = "task-profiler";
+
 // Generates full memory crash dump.
 const char kFullMemoryCrashReport[]         = "full-memory-crash-report";
 
diff --git a/base/base_switches.h b/base/base_switches.h
index 0585186..04b0773 100644
--- a/base/base_switches.h
+++ b/base/base_switches.h
@@ -16,6 +16,7 @@
 extern const char kEnableCrashReporter[];
 extern const char kEnableHeapProfiling[];
 extern const char kEnableHeapProfilingModeNative[];
+extern const char kEnableHeapProfilingTaskProfiler[];
 extern const char kEnableLowEndDeviceMode[];
 extern const char kForceFieldTrials[];
 extern const char kFullMemoryCrashReport[];
diff --git a/base/test/scoped_task_scheduler.cc b/base/test/scoped_task_scheduler.cc
index 3482f06..7bcd88a 100644
--- a/base/test/scoped_task_scheduler.cc
+++ b/base/test/scoped_task_scheduler.cc
@@ -77,10 +77,6 @@
   std::unique_ptr<MessageLoop> message_loop_owned_;
   MessageLoop* message_loop_;
 
-  // The SingleThreadTaskRunner associated with |message_loop_|.
-  const scoped_refptr<SingleThreadTaskRunner> message_loop_task_runner_ =
-      message_loop_->task_runner();
-
   // Handles shutdown behaviors and sets up the environment to run a task.
   internal::TaskTracker task_tracker_;
 
@@ -186,7 +182,7 @@
   if (!task_tracker_.WillPostTask(task.get()))
     return false;
   internal::Task* const task_ptr = task.get();
-  return message_loop_task_runner_->PostDelayedTask(
+  return message_loop_->task_runner()->PostDelayedTask(
       task_ptr->posted_from, Bind(&TestTaskScheduler::RunTask, Unretained(this),
                                   Passed(&task), sequence_token),
       task_ptr->delay);
@@ -196,6 +192,8 @@
                                 const SequenceToken& sequence_token) {
   // Clear the MessageLoop TaskRunner to allow TaskTracker to register its own
   // Thread/SequencedTaskRunnerHandle as appropriate.
+  scoped_refptr<SingleThreadTaskRunner> saved_task_runner =
+      MessageLoop::current()->task_runner();
   MessageLoop::current()->ClearTaskRunnerForTesting();
 
   // Run the task.
@@ -204,11 +202,11 @@
                                              : SequenceToken::Create());
 
   // Restore the MessageLoop TaskRunner.
-  MessageLoop::current()->SetTaskRunner(message_loop_task_runner_);
+  MessageLoop::current()->SetTaskRunner(saved_task_runner);
 }
 
 bool TestTaskScheduler::RunsTasksOnCurrentThread() const {
-  return message_loop_task_runner_->RunsTasksOnCurrentThread();
+  return message_loop_->task_runner()->RunsTasksOnCurrentThread();
 }
 
 TestTaskSchedulerTaskRunner::TestTaskSchedulerTaskRunner(
diff --git a/base/test/scoped_task_scheduler_unittest.cc b/base/test/scoped_task_scheduler_unittest.cc
index 8fb7016..cc0ffbb 100644
--- a/base/test/scoped_task_scheduler_unittest.cc
+++ b/base/test/scoped_task_scheduler_unittest.cc
@@ -12,9 +12,11 @@
 #include "base/task_scheduler/post_task.h"
 #include "base/task_scheduler/task_scheduler.h"
 #include "base/task_scheduler/test_utils.h"
+#include "base/test/scoped_mock_time_message_loop_task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_checker.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
 #include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -267,5 +269,33 @@
   EXPECT_TRUE(block_shutdown_task_ran);
 }
 
+TEST(ScopedTaskSchedulerTest, ReassignCurrentTaskRunner) {
+  bool first_task_ran = false;
+  bool second_task_ran = false;
+
+  auto TestTaskRan = [](bool* task_ran) { *task_ran = true; };
+
+  ScopedTaskScheduler scoped_task_scheduler;
+  {
+    ScopedMockTimeMessageLoopTaskRunner mock_time_task_runner;
+    PostDelayedTask(FROM_HERE, Bind(TestTaskRan, Unretained(&first_task_ran)),
+                    TimeDelta::FromSeconds(1));
+
+    // The delayed task should be queued on |mock_time_task_runner|, not the
+    // default task runner.
+    EXPECT_TRUE(mock_time_task_runner.task_runner()->HasPendingTask());
+  }
+
+  PostDelayedTask(FROM_HERE, Bind(TestTaskRan, Unretained(&second_task_ran)),
+                  TimeDelta());
+
+  RunLoop().RunUntilIdle();
+
+  // We never pumped |mock_time_task_runner| so the first task should not have
+  // run.
+  EXPECT_FALSE(first_task_ran);
+  EXPECT_TRUE(second_task_ran);
+}
+
 }  // namespace test
 }  // namespace base
diff --git a/base/trace_event/memory_dump_manager.cc b/base/trace_event/memory_dump_manager.cc
index 246a5aa..ebc2250 100644
--- a/base/trace_event/memory_dump_manager.cc
+++ b/base/trace_event/memory_dump_manager.cc
@@ -14,6 +14,7 @@
 #include "base/compiler_specific.h"
 #include "base/debug/debugging_flags.h"
 #include "base/debug/stack_trace.h"
+#include "base/debug/thread_heap_usage_tracker.h"
 #include "base/memory/ptr_util.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -186,18 +187,20 @@
   if (profiling_mode == "") {
     AllocationContextTracker::SetCaptureMode(
         AllocationContextTracker::CaptureMode::PSEUDO_STACK);
-  }
-  else if (profiling_mode == switches::kEnableHeapProfilingModeNative) {
 #if HAVE_TRACE_STACK_FRAME_POINTERS && \
     (BUILDFLAG(ENABLE_PROFILING) || !defined(NDEBUG))
+  } else if (profiling_mode == switches::kEnableHeapProfilingModeNative) {
     // We need frame pointers for native tracing to work, and they are
     // enabled in profiling and debug builds.
     AllocationContextTracker::SetCaptureMode(
         AllocationContextTracker::CaptureMode::NATIVE_STACK);
-#else
-    CHECK(false) << "'" << profiling_mode << "' mode for "
-                 << switches::kEnableHeapProfiling << " flag is not supported "
-                 << "for this platform / build type.";
+#endif
+#if BUILDFLAG(ENABLE_MEMORY_TASK_PROFILER)
+  } else if (profiling_mode == switches::kEnableHeapProfilingTaskProfiler) {
+    // Enable heap tracking, which in turn enables capture of heap usage
+    // tracking in tracked_objects.cc.
+    if (!base::debug::ThreadHeapUsageTracker::IsHeapTrackingEnabled())
+      base::debug::ThreadHeapUsageTracker::EnableHeapTracking();
 #endif
   } else {
     CHECK(false) << "Invalid mode '" << profiling_mode << "' for "
diff --git a/base/trace_event/memory_dump_manager.h b/base/trace_event/memory_dump_manager.h
index 61d1dd08..7579285 100644
--- a/base/trace_event/memory_dump_manager.h
+++ b/base/trace_event/memory_dump_manager.h
@@ -117,6 +117,9 @@
   void OnTraceLogEnabled() override;
   void OnTraceLogDisabled() override;
 
+  // Enable heap profiling if kEnableHeapProfiling is specified.
+  void EnableHeapProfilingIfNeeded();
+
   // Returns true if the dump mode is allowed for current tracing session.
   bool IsDumpModeAllowed(MemoryDumpLevelOfDetail dump_mode);
 
@@ -309,9 +312,6 @@
   static void FinalizeDumpAndAddToTrace(
       std::unique_ptr<ProcessMemoryDumpAsyncState> pmd_async_state);
 
-  // Enable heap profiling if kEnableHeapProfiling is specified.
-  void EnableHeapProfilingIfNeeded();
-
   // Internal, used only by MemoryDumpManagerDelegate.
   // Creates a memory dump for the current process and appends it to the trace.
   // |callback| will be invoked asynchronously upon completion on the same
diff --git a/base/tracked_objects.cc b/base/tracked_objects.cc
index 158fb94..1507c098 100644
--- a/base/tracked_objects.cc
+++ b/base/tracked_objects.cc
@@ -783,14 +783,6 @@
   // we get the lock earlier in this method.
   base::subtle::Release_Store(&status_, kInitialStartupState);
   DCHECK(base::subtle::NoBarrier_Load(&status_) != UNINITIALIZED);
-
-#if BUILDFLAG(ENABLE_MEMORY_TASK_PROFILER)
-  // Make sure heap tracking is enabled ASAP if the default state is active.
-  if (kInitialStartupState == PROFILING_ACTIVE &&
-      !base::debug::ThreadHeapUsageTracker::IsHeapTrackingEnabled()) {
-    base::debug::ThreadHeapUsageTracker::EnableHeapTracking();
-  }
-#endif  // BUILDFLAG(ENABLE_MEMORY_TASK_PROFILER)
 }
 
 // static
@@ -800,14 +792,9 @@
 
   EnsureTlsInitialization();  // No-op if already initialized.
 
-  if (status > DEACTIVATED) {
+  if (status > DEACTIVATED)
     status = PROFILING_ACTIVE;
 
-#if BUILDFLAG(ENABLE_MEMORY_TASK_PROFILER)
-    if (!base::debug::ThreadHeapUsageTracker::IsHeapTrackingEnabled())
-      base::debug::ThreadHeapUsageTracker::EnableHeapTracking();
-#endif  // BUILDFLAG(ENABLE_MEMORY_TASK_PROFILER)
-  }
   base::subtle::Release_Store(&status_, status);
 }
 
diff --git a/build/android/gradle/android.jinja b/build/android/gradle/android.jinja
index 385d999d..34640aa 100644
--- a/build/android/gradle/android.jinja
+++ b/build/android/gradle/android.jinja
@@ -40,6 +40,8 @@
     compileSdkVersion {{ compile_sdk_version }}
     buildToolsVersion "{{ build_tools_version }}"
     publishNonDefault true
+    // Multiple targets use the package name "dummy.package"
+    enforceUniquePackageName false
 
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_7
diff --git a/cc/input/main_thread_scrolling_reason.h b/cc/input/main_thread_scrolling_reason.h
index 899aad86..a2a0222 100644
--- a/cc/input/main_thread_scrolling_reason.h
+++ b/cc/input/main_thread_scrolling_reason.h
@@ -41,6 +41,7 @@
     kBackgroundNotOpaqueInRectAndLCDText = 1 << 18,
     kHasBorderRadius = 1 << 19,
     kHasClipRelatedProperty = 1 << 20,
+    kHasBoxShadowFromNonRootLayer = 1 << 21,
 
     // Transient scrolling reasons. These are computed for each scroll begin.
     kNonFastScrollableRegion = 1 << 5,
@@ -55,7 +56,7 @@
     // New flags should increment this number but it should never be decremented
     // because the values are used in UMA histograms. It should also be noted
     // that it excludes the kNotScrollingOnMain value.
-    kMainThreadScrollingReasonCount = 21,
+    kMainThreadScrollingReasonCount = 22,
   };
 
   // Returns true if the given MainThreadScrollingReason can be set by the main
@@ -67,7 +68,8 @@
         kScrollbarScrolling | kPageOverlay | kHandlingScrollFromMainThread |
         kCustomScrollbarScrolling | kHasOpacityAndLCDText |
         kHasTransformAndLCDText | kBackgroundNotOpaqueInRectAndLCDText |
-        kHasBorderRadius | kHasClipRelatedProperty;
+        kHasBorderRadius | kHasClipRelatedProperty |
+        kHasBoxShadowFromNonRootLayer;
     return (reasons & reasons_set_by_main_thread) == reasons;
   }
 
@@ -125,6 +127,8 @@
       tracedValue->AppendString("Has border radius");
     if (reasons & MainThreadScrollingReason::kHasClipRelatedProperty)
       tracedValue->AppendString("Has clip related property");
+    if (reasons & MainThreadScrollingReason::kHasBoxShadowFromNonRootLayer)
+      tracedValue->AppendString("Has box shadow from non-root layer");
 
     // Transient scrolling reasons.
     if (reasons & MainThreadScrollingReason::kNonFastScrollableRegion)
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 1d8a252..8841449 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -247,6 +247,7 @@
     "//components/omnibox/browser:autocomplete_match_type_javagen",
     "//components/security_state/core:security_state_enums_java",
     "//components/signin/core/browser:investigated_scenario_java",
+    "//components/supervised_user_error_page:enums_srcjar",
   ]
 
   # Manifest used for linting (determining unused resources).
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
index b4ee5f6d..9ba6f52 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
@@ -72,6 +72,14 @@
          */
         @CalledByNative("NormalizedAddressRequestDelegate")
         void onAddressNormalized(AutofillProfile profile);
+
+        /**
+         * Called when the address could not be normalized.
+         *
+         * @param profile The non normalized profile.
+         */
+        @CalledByNative("NormalizedAddressRequestDelegate")
+        void onCouldNotNormalize(AutofillProfile profile);
     }
 
     /**
@@ -811,20 +819,11 @@
      * @param guid The GUID of the profile to normalize.
      * @param regionCode The region code indicating which rules to use for normalization.
      * @param delegate The object requesting the normalization.
-     *
-     * @return Whether the normalization will happen asynchronously.
      */
-    public boolean normalizeAddress(
+    public void normalizeAddress(
             String guid, String regionCode, NormalizedAddressRequestDelegate delegate) {
         ThreadUtils.assertOnUiThread();
-        return nativeStartAddressNormalization(
-                mPersonalDataManagerAndroid, guid, regionCode, delegate);
-    }
-
-    /** Cancels the pending address normalizations. */
-    public void cancelPendingAddressNormalizations() {
-        ThreadUtils.assertOnUiThread();
-        nativeCancelPendingAddressNormalizations(mPersonalDataManagerAndroid);
+        nativeStartAddressNormalization(mPersonalDataManagerAndroid, guid, regionCode, delegate);
     }
 
     /**
@@ -955,10 +954,8 @@
             WebContents webContents, CreditCard card, FullCardRequestDelegate delegate);
     private native void nativeLoadRulesForRegion(
             long nativePersonalDataManagerAndroid, String regionCode);
-    private native boolean nativeStartAddressNormalization(long nativePersonalDataManagerAndroid,
+    private native void nativeStartAddressNormalization(long nativePersonalDataManagerAndroid,
             String guid, String regionCode, NormalizedAddressRequestDelegate delegate);
-    private native void nativeCancelPendingAddressNormalizations(
-            long nativePersonalDataManagerAndroid);
     private static native boolean nativeHasProfiles(long nativePersonalDataManagerAndroid);
     private static native boolean nativeHasCreditCards(long nativePersonalDataManagerAndroid);
     private static native boolean nativeIsAutofillEnabled();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java b/chrome/android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java
index 856da36..2992e12c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/childaccounts/ChildAccountService.java
@@ -12,15 +12,19 @@
 import org.chromium.components.signin.AccountManagerHelper;
 
 /**
- * This class serves as a simple interface for querying the child account information.
- * It has two methods namely, checkHasChildAccount(...) which is asynchronous and queries the
- * system directly for the information and the synchronous isChildAccount() which asks the native
- * side assuming it has been set correctly already.
+ * This class serves as a simple interface for querying the child account information. It has two
+ * methods for querying the child account information; checkHasChildAccount(...) which is
+ * asynchronous and queries the system directly for the information and the synchronous
+ * isChildAccount() which asks the native side assuming it has been set correctly already.
  *
  * The former method is used by ForcedSigninProcessor and FirstRunFlowSequencer to detect child
- * accounts since the native side is only activated on signing in.
- * Once signed in by the ForcedSigninProcessor, the ChildAccountInfoFetcher will notify the native
- * side and also takes responsibility for monitoring changes and taking a suitable action.
+ * accounts since the native side is only activated on signing in. Once signed in by the
+ * ForcedSigninProcessor, the ChildAccountInfoFetcher will notify the native side and also takes
+ * responsibility for monitoring changes and taking a suitable action.
+ *
+ * The class also provides an interface through which a client can listen for child account status
+ * changes. When the SupervisedUserContentProvider forces sign-in it waits for a status change
+ * before querying the URL filters.
  */
 public class ChildAccountService {
     private ChildAccountService() {
@@ -57,5 +61,15 @@
         return nativeIsChildAccount();
     }
 
+    /**
+     * Set a callback to be called the next time a child account status change is received
+     * @param callback the callback to be called when the status changes.
+     */
+    public static void listenForStatusChange(Callback<Boolean> callback) {
+        nativeListenForChildStatusReceived(callback);
+    }
+
     private static native boolean nativeIsChildAccount();
+
+    private static native void nativeListenForChildStatusReceived(Callback<Boolean> callback);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PostMessageHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PostMessageHandler.java
index 7441097..62f84f5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PostMessageHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PostMessageHandler.java
@@ -14,10 +14,6 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.content.browser.AppWebMessagePort;
-import org.chromium.content.browser.AppWebMessagePortService;
-import org.chromium.content.browser.AppWebMessagePortService.MessageChannelObserver;
-import org.chromium.content.browser.PostMessageSender;
-import org.chromium.content.browser.PostMessageSender.PostMessageSenderDelegate;
 import org.chromium.content_public.browser.MessagePort;
 import org.chromium.content_public.browser.MessagePort.MessageCallback;
 import org.chromium.content_public.browser.WebContents;
@@ -27,22 +23,13 @@
  * A class that handles postMessage communications with a designated {@link CustomTabsSessionToken}.
  */
 public class PostMessageHandler extends PostMessageServiceConnection {
-    private static AppWebMessagePortService sService;
-
     private final MessageCallback mMessageCallback;
     private WebContents mWebContents;
     private boolean mMessageChannelCreated;
     private boolean mBoundToService;
     private AppWebMessagePort[] mChannel;
-    private PostMessageSender mPostMessageSender;
-    private PostMessageSenderDelegate mSenderDelegate;
     private Uri mOrigin;
 
-    private static AppWebMessagePortService getAppWebMessagePortService() {
-        if (sService == null) sService = new AppWebMessagePortService();
-        return sService;
-    }
-
     /**
      * Basic constructor. Everytime the given {@link CustomTabsSessionToken} is associated with a
      * new {@link WebContents},
@@ -111,52 +98,20 @@
     }
 
     private void initializeWithWebContents(final WebContents webContents) {
-        final AppWebMessagePortService service = getAppWebMessagePortService();
-        mChannel = (AppWebMessagePort[]) webContents.createMessageChannel(service);
+        mChannel = (AppWebMessagePort[]) webContents.createMessageChannel();
         mChannel[0].setMessageCallback(mMessageCallback, null);
-        mSenderDelegate = new PostMessageSenderDelegate() {
-            @Override
-            public void postMessageToWeb(
-                    String frameName, String message, String targetOrigin,
-                    int[] sentPortIds) {
-                if (webContents.isDestroyed()) {
-                    disconnectChannel();
-                    unbindFromContext(ContextUtils.getApplicationContext());
-                    return;
-                }
-                webContents.postMessageToFrame(
-                        frameName, message, mOrigin.toString(), targetOrigin, sentPortIds);
-            }
 
-            @Override
-            public void onPostMessageQueueEmpty() {}
+        webContents.postMessageToFrame(
+                null, "", mOrigin.toString(), "", new AppWebMessagePort[] {mChannel[1]});
 
-            @Override
-            public boolean isPostMessageSenderReady() {
-                return true;
-            }
-        };
-        mPostMessageSender = new PostMessageSender(
-                mSenderDelegate, getAppWebMessagePortService());
-        service.addObserver(new MessageChannelObserver() {
-            @Override
-            public void onMessageChannelCreated() {
-                service.removeObserver(this);
-                if (mChannel == null) return;
-                mPostMessageSender.postMessage(
-                        null, "", "", new AppWebMessagePort[] {mChannel[1]});
-                mMessageChannelCreated = true;
-                if (mBoundToService) notifyMessageChannelReady(null);
-            }
-        });
+        mMessageChannelCreated = true;
+        if (mBoundToService) notifyMessageChannelReady(null);
     }
 
     private void disconnectChannel() {
         if (mChannel == null) return;
         mChannel[0].close();
         mChannel = null;
-        mSenderDelegate = null;
-        mPostMessageSender = null;
         mWebContents = null;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java
index 82ac3ab9..8524782 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/ForcedSigninProcessor.java
@@ -19,6 +19,8 @@
 import org.chromium.components.signin.AccountManagerHelper;
 import org.chromium.components.signin.ChromeSigninController;
 
+import javax.annotation.Nullable;
+
 /**
  * A helper to perform all necessary steps for forced sign in.
  * The helper performs:
@@ -44,7 +46,7 @@
      * This is triggered once per Chrome Application lifetime and everytime the Account state
      * changes with early exit if an account has already been signed in.
      */
-    public static void start(final Context appContext) {
+    public static void start(final Context appContext, @Nullable final Runnable onComplete) {
         if (ChromeSigninController.get(appContext).isSignedIn()) return;
         new AndroidEduAndChildAccountHelper() {
             @Override
@@ -55,7 +57,7 @@
                 if (!isAndroidEduDevice && !hasChildAccount) return;
                 // Child account and EDU device at the same time is not supported.
                 assert !(isAndroidEduDevice && hasChildAccount);
-                processForcedSignIn(appContext);
+                processForcedSignIn(appContext, onComplete);
             }
         }.start(appContext);
     }
@@ -64,7 +66,8 @@
      * Processes the fully automatic non-FRE-related forced sign-in.
      * This is used to enforce the environment for Android EDU and child accounts.
      */
-    private static void processForcedSignIn(final Context appContext) {
+    private static void processForcedSignIn(
+            final Context appContext, @Nullable final Runnable onComplete) {
         final SigninManager signinManager = SigninManager.get(appContext);
         // By definition we have finished all the checks for first run.
         signinManager.onFirstRunCheckDone();
@@ -85,10 +88,17 @@
                         // Since this is a forced signin, signout is not allowed.
                         AccountManagementFragment.setSignOutAllowedPreferenceValue(
                                 appContext, false);
+                        if (onComplete != null) {
+                            onComplete.run();
+                        }
                     }
 
                     @Override
-                    public void onSignInAborted() {}
+                    public void onSignInAborted() {
+                        if (onComplete != null) {
+                            onComplete.run();
+                        }
+                    }
                 });
             }
         });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
index 963f68f..396b524 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -61,7 +61,7 @@
  */
 public class ChromeBrowserInitializer {
     private static final String TAG = "BrowserInitializer";
-    private static ChromeBrowserInitializer sChromeBrowserInitiliazer;
+    private static ChromeBrowserInitializer sChromeBrowserInitializer;
 
     private final Handler mHandler;
     private final ChromeApplication mApplication;
@@ -93,10 +93,10 @@
      * @return The singleton instance of {@link ChromeBrowserInitializer}.
      */
     public static ChromeBrowserInitializer getInstance(Context context) {
-        if (sChromeBrowserInitiliazer == null) {
-            sChromeBrowserInitiliazer = new ChromeBrowserInitializer(context);
+        if (sChromeBrowserInitializer == null) {
+            sChromeBrowserInitializer = new ChromeBrowserInitializer(context);
         }
-        return sChromeBrowserInitiliazer;
+        return sChromeBrowserInitializer;
     }
 
     private ChromeBrowserInitializer(Context context) {
@@ -439,4 +439,12 @@
             }
         };
     }
+
+    /**
+     * For unit testing of clients.
+     * @param initializer The (dummy or mocked) initializer to use.
+     */
+    public static void setForTesting(ChromeBrowserInitializer initializer) {
+        sChromeBrowserInitializer = initializer;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
index 83ec9847..d3bbe34441 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -206,7 +206,7 @@
         DeferredStartupHandler.getInstance().addDeferredTask(new Runnable() {
             @Override
             public void run() {
-                ForcedSigninProcessor.start(application);
+                ForcedSigninProcessor.start(application, null);
                 AccountsChangedReceiver.addObserver(
                         new AccountsChangedReceiver.AccountsChangedObserver() {
                             @Override
@@ -214,7 +214,7 @@
                                 ThreadUtils.runOnUiThread(new Runnable() {
                                     @Override
                                     public void run() {
-                                        ForcedSigninProcessor.start(application);
+                                        ForcedSigninProcessor.start(application, null);
                                     }
                                 });
                             }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
index be2dea30..69c65280 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/snippets/SnippetArticleViewHolder.java
@@ -245,6 +245,9 @@
         if (horizontalStyle == HorizontalDisplayStyle.NARROW) return false;
         if (verticalStyle == VerticalDisplayStyle.FLAT) return false;
 
+        // When article's description is empty, we do not want empty space.
+        if (mArticle != null && TextUtils.isEmpty(mArticle.mPreviewText)) return false;
+
         return true;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
index d61c4d4..f693c299 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentApp.java
@@ -19,6 +19,7 @@
 
 import org.chromium.IsReadyToPayService;
 import org.chromium.IsReadyToPayServiceCallback;
+import org.chromium.base.ThreadUtils;
 import org.chromium.chrome.R;
 import org.chromium.content.browser.ContentViewCore;
 import org.chromium.content_public.browser.WebContents;
@@ -74,6 +75,7 @@
             respondToGetInstrumentsQuery(null);
         }
     };
+
     /**
      * Builds the point of interaction with a locally installed 3rd party native Android payment
      * app.
@@ -87,6 +89,7 @@
     public AndroidPaymentApp(WebContents webContents, String packageName, String activity,
             String label, Drawable icon) {
         super(packageName, label, null, icon);
+        ThreadUtils.assertOnUiThread();
         mHandler = new Handler();
         mWebContents = webContents;
         mPayIntent = new Intent();
@@ -126,12 +129,7 @@
                 : "Have not responded to previous request for instruments yet";
         mInstrumentsCallback = callback;
         if (mIsReadyToPayIntent.getPackage() == null) {
-            mHandler.post(new Runnable() {
-                @Override
-                public void run() {
-                    respondToGetInstrumentsQuery(AndroidPaymentApp.this);
-                }
-            });
+            respondToGetInstrumentsQuery(AndroidPaymentApp.this);
             return;
         }
         Bundle extras = new Bundle();
@@ -166,14 +164,20 @@
         }
     }
 
-    private void respondToGetInstrumentsQuery(PaymentInstrument instrument) {
-        List<PaymentInstrument> instruments = null;
-        if (instrument != null) {
-            instruments = new ArrayList<>();
-            instruments.add(instrument);
-        }
-        mInstrumentsCallback.onInstrumentsReady(this, instruments);
-        mInstrumentsCallback = null;
+    private void respondToGetInstrumentsQuery(final PaymentInstrument instrument) {
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                ThreadUtils.assertOnUiThread();
+                List<PaymentInstrument> instruments = null;
+                if (instrument != null) {
+                    instruments = new ArrayList<>();
+                    instruments.add(instrument);
+                }
+                mInstrumentsCallback.onInstrumentsReady(AndroidPaymentApp.this, instruments);
+                mInstrumentsCallback = null;
+            }
+        });
     }
 
     private void sendIsReadyToPayIntentToPaymentApp() {
@@ -318,6 +322,7 @@
 
     @Override
     public void onIntentCompleted(WindowAndroid window, int resultCode, Intent data) {
+        ThreadUtils.assertOnUiThread();
         window.removeIntentCallback(this);
         if (data == null || data.getExtras() == null || resultCode != Activity.RESULT_OK) {
             mInstrumentDetailsCallback.onInstrumentDetailsError();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentInstrument.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentInstrument.java
index b781280..ef0826e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentInstrument.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillPaymentInstrument.java
@@ -154,6 +154,11 @@
         if (!mIsWaitingForFullCardDetails) sendIntrumentDetails();
     }
 
+    @Override
+    public void onCouldNotNormalize(AutofillProfile profile) {
+        onAddressNormalized(null);
+    }
+
     /**
      * Stringify the card details and send the resulting string and the method name to the
      * registered callback.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index 36f29fda..6945efd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -1465,7 +1465,6 @@
     public void onPaymentResponseReady(PaymentResponse response) {
         mClient.onPaymentResponse(response);
         mPaymentResponseHelper = null;
-        PersonalDataManager.getInstance().cancelPendingAddressNormalizations();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentResponseHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentResponseHelper.java
index 54641ac..20863093 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentResponseHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentResponseHelper.java
@@ -138,4 +138,9 @@
         // Wait for the payment details before sending the response.
         if (!mIsWaitingForPaymentsDetails) mDelegate.onPaymentResponseReady(mPaymentResponse);
     }
+
+    @Override
+    public void onCouldNotNormalize(AutofillProfile profile) {
+        onAddressNormalized(null);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java
index 04f5e11..88bd0ea 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProvider.java
@@ -14,13 +14,18 @@
 import android.os.SystemClock;
 import android.os.UserManager;
 
+import org.chromium.base.Callback;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.library_loader.LibraryLoader;
 import org.chromium.base.library_loader.ProcessInitException;
 import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.chrome.browser.childaccounts.ChildAccountService;
+import org.chromium.chrome.browser.firstrun.ForcedSigninProcessor;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
+import org.chromium.components.signin.ChromeSigninController;
+import org.chromium.components.supervisedusererrorpage.FilteringBehaviorReason;
 import org.chromium.components.webrestrictions.browser.WebRestrictionsContentProvider;
 
 import java.util.concurrent.ArrayBlockingQueue;
@@ -36,24 +41,78 @@
     private long mNativeSupervisedUserContentProvider;
     private boolean mChromeAlreadyStarted;
     private static Object sEnabledLock = new Object();
+    private static Object sContentProviderLock = new Object();
+
+    private static final String TAG = "SupervisedUserContent";
 
     // Three value "boolean" caching enabled state, null if not yet known.
     private static Boolean sEnabled;
 
-    private long getSupervisedUserContentProvider() throws ProcessInitException {
-        mChromeAlreadyStarted = LibraryLoader.isInitialized();
-        if (mNativeSupervisedUserContentProvider != 0) {
-            return mNativeSupervisedUserContentProvider;
-        }
-
-        ChromeBrowserInitializer.getInstance(getContext()).handleSynchronousStartup();
-
-        mNativeSupervisedUserContentProvider = nativeCreateSupervisedUserContentProvider();
-        return mNativeSupervisedUserContentProvider;
+    @VisibleForTesting
+    void startForcedSigninProcessor(Context appContext, Runnable onComplete) {
+        ForcedSigninProcessor.start(appContext, onComplete);
     }
 
-    void setNativeSupervisedUserContentProviderForTesting(long nativeProvider) {
-        mNativeSupervisedUserContentProvider = nativeProvider;
+    @VisibleForTesting
+    void listenForChildAccountStatusChange(Callback<Boolean> callback) {
+        ChildAccountService.listenForStatusChange(callback);
+    }
+
+    private long getSupervisedUserContentProvider() {
+        // This may lock for some time, but is always called on a background thread, and will only
+        // take significant time if the Chrome process isn't already running.
+        synchronized (sContentProviderLock) {
+            mChromeAlreadyStarted = LibraryLoader.isInitialized();
+            if (mNativeSupervisedUserContentProvider != 0) {
+                return mNativeSupervisedUserContentProvider;
+            }
+            final Context appContext = getContext().getApplicationContext();
+            final SupervisedUserReply<Long> reply = new SupervisedUserReply<>();
+            ThreadUtils.runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    try {
+                        ChromeBrowserInitializer.getInstance(appContext).handleSynchronousStartup();
+                    } catch (ProcessInitException e) {
+                        reply.onQueryFinished(0L);
+                        return;
+                    }
+                    final ChromeSigninController chromeSigninController =
+                            ChromeSigninController.get(appContext);
+                    if (chromeSigninController.isSignedIn()) {
+                        reply.onQueryFinished(nativeCreateSupervisedUserContentProvider());
+                        return;
+                    }
+                    // Try to sign in, Chrome needs to be signed in to get the URL filter.
+                    startForcedSigninProcessor(appContext, new Runnable() {
+                        @Override
+                        public void run() {
+                            if (!chromeSigninController.isSignedIn()) {
+                                reply.onQueryFinished(0L);
+                                return;
+                            }
+                            // Wait for the status change; Chrome can't check any URLs until this
+                            // has happened.
+                            listenForChildAccountStatusChange(new Callback<Boolean>() {
+                                @Override
+                                public void onResult(Boolean result) {
+                                    reply.onQueryFinished(
+                                            nativeCreateSupervisedUserContentProvider());
+                                }
+                            });
+                        }
+                    });
+                }
+            });
+            try {
+                Long result = reply.getResult();
+                if (result == null) return 0;
+                mNativeSupervisedUserContentProvider = result;
+                return mNativeSupervisedUserContentProvider;
+            } catch (InterruptedException e) {
+                return 0;
+            }
+        }
     }
 
     static class SupervisedUserReply<T> {
@@ -109,14 +168,15 @@
         // object also handles waiting for the reply.
         long startTimeMs = SystemClock.elapsedRealtime();
         final SupervisedUserQueryReply queryReply = new SupervisedUserQueryReply();
+        final long contentProvider = getSupervisedUserContentProvider();
+        if (contentProvider == 0) {
+            return new WebRestrictionsResult(
+                    false, new int[] {FilteringBehaviorReason.NOT_SIGNED_IN}, null);
+        }
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                try {
-                    nativeShouldProceed(getSupervisedUserContentProvider(), queryReply, url);
-                } catch (ProcessInitException e) {
-                    queryReply.onQueryFailedNoErrorData();
-                }
+                nativeShouldProceed(contentProvider, queryReply, url);
             }
         });
         try {
@@ -159,14 +219,12 @@
         // reply object for each query, and passing this through the callback structure. The reply
         // object also handles waiting for the reply.
         final SupervisedUserInsertReply insertReply = new SupervisedUserInsertReply();
+        final long contentProvider = getSupervisedUserContentProvider();
+        if (contentProvider == 0) return false;
         ThreadUtils.runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                try {
-                    nativeRequestInsert(getSupervisedUserContentProvider(), insertReply, url);
-                } catch (ProcessInitException e) {
-                    insertReply.onInsertRequestSendComplete(false);
-                }
+                nativeRequestInsert(contentProvider, insertReply, url);
             }
         });
         try {
@@ -178,26 +236,6 @@
         }
     }
 
-    @Override
-    public Bundle call(String method, String arg, Bundle bundle) {
-        if (method.equals("setFilterForTesting")) setFilterForTesting();
-        return null;
-    }
-
-    void setFilterForTesting() {
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    nativeSetFilterForTesting(getSupervisedUserContentProvider());
-                } catch (ProcessInitException e) {
-                    // There is no way of returning anything sensible here, so ignore the error and
-                    // do nothing.
-                }
-            }
-        });
-    }
-
     @CalledByNative
     void onSupervisedUserFilterUpdated() {
         onFilterChanged();
@@ -249,7 +287,38 @@
         Bundle appRestrictions = userManager
                 .getApplicationRestrictions(getContext().getPackageName());
         setEnabled(appRestrictions.getBoolean(SUPERVISED_USER_CONTENT_PROVIDER_ENABLED));
-    };
+    }
+
+    @Override
+    protected String[] getErrorColumnNames() {
+        String result[] = {"Reason", "Allow access requests", "Is child account",
+                "Profile image URL", "Second profile image URL", "Custodian", "Custodian email",
+                "Second custodian", "Second custodian email"};
+        return result;
+    }
+
+    // Helpers for testing.
+
+    @Override
+    public Bundle call(String method, String arg, Bundle bundle) {
+        if (method.equals("setFilterForTesting")) setFilterForTesting();
+        return null;
+    }
+
+    void setFilterForTesting() {
+        final long contentProvider = getSupervisedUserContentProvider();
+        if (contentProvider == 0) return;
+        ThreadUtils.runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                nativeSetFilterForTesting(contentProvider);
+            }
+        });
+    }
+
+    void setNativeSupervisedUserContentProviderForTesting(long nativeProvider) {
+        mNativeSupervisedUserContentProvider = nativeProvider;
+    }
 
     @VisibleForTesting
     public static void enableContentProviderForTesting() {
@@ -266,11 +335,4 @@
 
     private native void nativeSetFilterForTesting(long nativeSupervisedUserContentProvider);
 
-    @Override
-    protected String[] getErrorColumnNames() {
-        String result[] = {"Reason", "Allow access requests", "Is child account",
-                "Profile image URL", "Second profile image URL", "Custodian", "Custodian email",
-                "Second custodian", "Second custodian email"};
-        return result;
-    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderTest.java
index c436898..b2352ed 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderTest.java
@@ -93,10 +93,10 @@
         SupervisedUserContentProvider.enableContentProviderForTesting();
         Cursor cursor = client.query(mUri, null, "url = 'http://google.com'", null, null);
         assertNotNull(cursor);
-        assertEquals(WebRestrictionsContentProvider.PROCEED, cursor.getInt(0));
+        assertEquals(WebRestrictionsContentProvider.BLOCKED, cursor.getInt(0));
         cursor = client.query(mUri, null, "url = 'http://www.notgoogle.com'", null, null);
         assertNotNull(cursor);
-        assertEquals(WebRestrictionsContentProvider.PROCEED, cursor.getInt(0));
+        assertEquals(WebRestrictionsContentProvider.BLOCKED, cursor.getInt(0));
     }
 
     @SmallTest
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderUnitTest.java
index 07fafd3..1706192 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/superviseduser/SupervisedUserContentProviderUnitTest.java
@@ -11,9 +11,14 @@
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
+import android.accounts.Account;
+import android.content.Context;
+
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -21,9 +26,18 @@
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 
+import org.chromium.base.Callback;
+import org.chromium.base.ContextUtils;
+import org.chromium.base.library_loader.ProcessInitException;
 import org.chromium.chrome.browser.DisableHistogramsRule;
+import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
+import org.chromium.chrome.browser.superviseduser.SupervisedUserContentProvider.SupervisedUserQueryReply;
+import org.chromium.components.signin.AccountManagerDelegate;
+import org.chromium.components.signin.AccountManagerHelper;
+import org.chromium.components.signin.ChromeSigninController;
 import org.chromium.components.webrestrictions.browser.WebRestrictionsContentProvider.WebRestrictionsResult;
 import org.chromium.testing.local.LocalRobolectricTestRunner;
 
@@ -41,20 +55,70 @@
 
     @Before
     public void setUp() {
-        mSupervisedUserContentProvider = Mockito.spy(new SupervisedUserContentProvider());
-        mSupervisedUserContentProvider.setNativeSupervisedUserContentProviderForTesting(1234L);
+        // Ensure clean state (in particular not signed in).
+        ContextUtils.getAppSharedPreferences().edit().clear().apply();
+
+        // Spy on the content provider so that we can watch its calls. Override methods that wrap
+        // things that can't be mocked (including native calls).
+        mSupervisedUserContentProvider = Mockito.spy(new SupervisedUserContentProvider() {
+            @Override
+            void startForcedSigninProcessor(Context context, Runnable onComplete) {
+                ChromeSigninController.get(RuntimeEnvironment.application)
+                        .setSignedInAccountName("Dummy");
+                onComplete.run();
+            }
+
+            @Override
+            void listenForChildAccountStatusChange(Callback<Boolean> callback) {
+                callback.onResult(true);
+            }
+
+            @Override
+            void nativeShouldProceed(long l, SupervisedUserQueryReply reply, String url) {
+                reply.onQueryComplete();
+            }
+
+            @Override
+            void nativeRequestInsert(long l, SupervisedUserInsertReply reply, String url) {
+                reply.onInsertRequestSendComplete(true);
+            }
+
+            @Override
+            long nativeCreateSupervisedUserContentProvider() {
+                return 5678L;
+            }
+        });
+    }
+
+    @After
+    public void shutDown() {
+        ContextUtils.getAppSharedPreferences().edit().clear().apply();
+        ChromeBrowserInitializer.setForTesting(null);
     }
 
     @Test
-    public void testShouldProceed() throws InterruptedException {
+    public void testShouldProceed_PermittedUrl() {
+        mSupervisedUserContentProvider.setNativeSupervisedUserContentProviderForTesting(1234L);
         // Mock the native call for a permitted URL
+        WebRestrictionsResult result = mSupervisedUserContentProvider.shouldProceed("url");
+        assertThat(result.shouldProceed(), is(true));
+        verify(mSupervisedUserContentProvider)
+                .nativeShouldProceed(eq(1234L),
+                        any(SupervisedUserContentProvider.SupervisedUserQueryReply.class),
+                        eq("url"));
+    }
+
+    @Test
+    public void testShouldProceed_ForbiddenUrl() {
+        mSupervisedUserContentProvider.setNativeSupervisedUserContentProviderForTesting(1234L);
+        // Modify the result of the native call to make this a forbidden URL
         doAnswer(new Answer<Void>() {
 
             @Override
             public Void answer(InvocationOnMock invocation) throws Throwable {
-                Object args[] = invocation.getArguments();
-                ((SupervisedUserContentProvider.SupervisedUserQueryReply) args[1])
-                        .onQueryComplete();
+                invocation.<SupervisedUserQueryReply>getArgument(1).onQueryFailed(1, 2, 3, "url1",
+                        "url2", "custodian", "custodianEmail", "secondCustodian",
+                        "secondCustodianEmail");
                 return null;
             }
 
@@ -64,29 +128,6 @@
                         any(SupervisedUserContentProvider.SupervisedUserQueryReply.class),
                         anyString());
         WebRestrictionsResult result = mSupervisedUserContentProvider.shouldProceed("url");
-        assertThat(result.shouldProceed(), is(true));
-        verify(mSupervisedUserContentProvider)
-                .nativeShouldProceed(eq(1234L),
-                        any(SupervisedUserContentProvider.SupervisedUserQueryReply.class),
-                        eq("url"));
-        // Mock the native call for a forbidden URL
-        doAnswer(new Answer<Void>() {
-
-            @Override
-            public Void answer(InvocationOnMock invocation) throws Throwable {
-                Object args[] = invocation.getArguments();
-                ((SupervisedUserContentProvider.SupervisedUserQueryReply) args[1])
-                        .onQueryFailed(1, 2, 3, "url1", "url2", "custodian", "custodianEmail",
-                                "secondCustodian", "secondCustodianEmail");
-                return null;
-            }
-
-        })
-                .when(mSupervisedUserContentProvider)
-                .nativeShouldProceed(anyLong(),
-                        any(SupervisedUserContentProvider.SupervisedUserQueryReply.class),
-                        anyString());
-        result = mSupervisedUserContentProvider.shouldProceed("url");
         assertThat(result.shouldProceed(), is(false));
         assertThat(result.errorIntCount(), is(3));
         assertThat(result.getErrorInt(0), is(1));
@@ -102,30 +143,22 @@
     }
 
     @Test
-    public void testRequestInsert() throws InterruptedException {
-        // Mock native call.
-        doAnswer(new Answer<Void>() {
+    public void testRequestInsert_ok() {
+        mSupervisedUserContentProvider.setNativeSupervisedUserContentProviderForTesting(1234L);
 
-            @Override
-            public Void answer(InvocationOnMock invocation) throws Throwable {
-                Object args[] = invocation.getArguments();
-                ((SupervisedUserContentProvider.SupervisedUserInsertReply) args[1])
-                        .onInsertRequestSendComplete(true);
-                return null;
-            }
-
-        })
-                .when(mSupervisedUserContentProvider)
-                .nativeRequestInsert(anyLong(),
-                        any(SupervisedUserContentProvider.SupervisedUserInsertReply.class),
-                        anyString());
         assertThat(mSupervisedUserContentProvider.requestInsert("url"), is(true));
+
         verify(mSupervisedUserContentProvider)
                 .nativeRequestInsert(eq(1234L),
                         any(SupervisedUserContentProvider.SupervisedUserInsertReply.class),
                         eq("url"));
-        doAnswer(new Answer<Void>() {
+    }
 
+    @Test
+    public void testRequestInsert_failed() {
+        mSupervisedUserContentProvider.setNativeSupervisedUserContentProviderForTesting(1234L);
+        // Mock the native call to mock failure
+        doAnswer(new Answer<Void>() {
             @Override
             public Void answer(InvocationOnMock invocation) throws Throwable {
                 Object args[] = invocation.getArguments();
@@ -140,9 +173,81 @@
                         any(SupervisedUserContentProvider.SupervisedUserInsertReply.class),
                         anyString());
         assertThat(mSupervisedUserContentProvider.requestInsert("url"), is(false));
-        verify(mSupervisedUserContentProvider, times(2))
+        verify(mSupervisedUserContentProvider)
                 .nativeRequestInsert(eq(1234L),
                         any(SupervisedUserContentProvider.SupervisedUserInsertReply.class),
                         eq("url"));
     }
+
+    @Test
+    public void testShouldProceed_withStartupSignedIn() throws ProcessInitException {
+        // Set up a signed in user
+        ChromeSigninController.get(RuntimeEnvironment.application).setSignedInAccountName("Dummy");
+        // Mock things called during startup
+        ChromeBrowserInitializer mockBrowserInitializer = mock(ChromeBrowserInitializer.class);
+        ChromeBrowserInitializer.setForTesting(mockBrowserInitializer);
+
+        WebRestrictionsResult result = mSupervisedUserContentProvider.shouldProceed("url");
+
+        assertThat(result.shouldProceed(), is(true));
+        verify(mockBrowserInitializer).handleSynchronousStartup();
+        verify(mSupervisedUserContentProvider)
+                .nativeShouldProceed(eq(5678L),
+                        any(SupervisedUserContentProvider.SupervisedUserQueryReply.class),
+                        eq("url"));
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testShouldProceed_notSignedIn() throws ProcessInitException {
+        // Mock things called during startup
+        ChromeBrowserInitializer mockBrowserInitializer = mock(ChromeBrowserInitializer.class);
+        ChromeBrowserInitializer.setForTesting(mockBrowserInitializer);
+        AccountManagerDelegate mockDelegate = mock(AccountManagerDelegate.class);
+        AccountManagerHelper.overrideAccountManagerHelperForTests(
+                RuntimeEnvironment.application, mockDelegate);
+        Account account = new Account("Google", "Dummy");
+        when(mockDelegate.getAccountsByType("Google")).thenReturn(new Account[] {account});
+
+        WebRestrictionsResult result = mSupervisedUserContentProvider.shouldProceed("url");
+
+        assertThat(result.shouldProceed(), is(true));
+        verify(mockBrowserInitializer).handleSynchronousStartup();
+        verify(mSupervisedUserContentProvider)
+                .startForcedSigninProcessor(any(Context.class), any(Runnable.class));
+        verify(mSupervisedUserContentProvider)
+                .listenForChildAccountStatusChange(any(Callback.class));
+        verify(mSupervisedUserContentProvider)
+                .nativeShouldProceed(eq(5678L),
+                        any(SupervisedUserContentProvider.SupervisedUserQueryReply.class),
+                        eq("url"));
+    }
+
+    @Test
+    public void testShouldProceed_cannotSignIn() throws ProcessInitException {
+        // Mock things called during startup
+        ChromeBrowserInitializer mockBrowserInitializer = mock(ChromeBrowserInitializer.class);
+        ChromeBrowserInitializer.setForTesting(mockBrowserInitializer);
+        AccountManagerDelegate mockDelegate = mock(AccountManagerDelegate.class);
+        AccountManagerHelper.overrideAccountManagerHelperForTests(
+                RuntimeEnvironment.application, mockDelegate);
+        Account account = new Account("Google", "Dummy");
+        when(mockDelegate.getAccountsByType("Google")).thenReturn(new Account[] {account});
+
+        // Change the behavior of the forced sign-in processor to not sign in.
+        doAnswer(new Answer<Void>() {
+            @Override
+            public Void answer(InvocationOnMock invocation) throws Throwable {
+                invocation.<Runnable>getArgument(1).run();
+                return null;
+            }
+        })
+                .when(mSupervisedUserContentProvider)
+                .startForcedSigninProcessor(any(Context.class), any(Runnable.class));
+
+        WebRestrictionsResult result = mSupervisedUserContentProvider.shouldProceed("url");
+
+        assertThat(result.shouldProceed(), is(false));
+        assertThat(result.getErrorInt(0), is(5));
+    }
 }
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp
index de0aa35..588634d 100644
--- a/chrome/app/settings_strings.grdp
+++ b/chrome/app/settings_strings.grdp
@@ -2175,18 +2175,18 @@
     <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS_DESCRIPTION" desc="Secondary text on the lock screen which opens up the fingerprint subpage.">
       Set up a faster way to unlock your device
     </message>
+    <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NUM_FINGERPRINTS" desc="Text on the lock screen which tells users how many fingerprints they have enrolled.">
+      <ph name="NUM_FINGERPRINTS">$1<ex>1</ex></ph> fingerprints set up
+    </message>
     <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_SUBPAGE_TITLE" desc="Title of the fingerprint subpage.">
       Fingerprint
     </message>
     <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_REGISTERED_FINGERPRINTS_LABEL" desc="Text above fingerprint list that tells users their registered fingerprints.">
-      Registered fingerprints:
+      Saved fingerprints
     </message>
     <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ADD_FINGERPRINT_BUTTON" desc="Button that is used to add a new fingerprint.">
       Add Fingerprint
     </message>
-    <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CANNOT_ADD_NEW_FINGERPRINT" desc="Text telling users they have reached the maximum allowed fingerprints.">
-      You can only add <ph name="MAX_FINGERPRINTS">$1<ex>5</ex></ph> fingerprints.
-    </message>
     <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_FINGERPRINT_LESS_SECURE" desc="Text telling users that fingerprints might be less secure than strong PINs or passwords.">
       Note: Your fingerprint may be less secure than a strong password or PIN.
     </message>
@@ -2194,10 +2194,10 @@
       Finger <ph name="NEW_FINGER_NUMBER">$1<ex>1</ex></ph>
     </message>
     <message name="IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ENABLE_FINGERPRINT_CHECKBOX_LABEL" desc="The text on the label of the checkbox which allows users to enable or disable fingerprint usage.">
-      Enable fingerprint login and authentication
+      Enable fingerprint unlock
     </message>
     <message name="IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_TITLE" desc="Title of the add fingerprint dialog popup.">
-      Add Fingerprint
+      Add a fingerprint
     </message>
     <message name="IDS_SETTINGS_ADD_FINGERPRINT_DIALOG_INSTRUCTION_LOCATE_SCANNER" desc="Text in the add fingerprint dialog telling users what to do for step 1.">
       Locate the fingerprint sensor on your device, then place the finger you would like to register on it.
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc
index ae253ab..15d33758 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.cc
+++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
@@ -17,6 +17,7 @@
 #include "base/time/time.h"
 #include "chrome/browser/android/resource_mapper.h"
 #include "chrome/browser/autofill/personal_data_manager_factory.h"
+#include "chrome/browser/autofill/validation_rules_storage_factory.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
@@ -41,7 +42,6 @@
 #include "jni/PersonalDataManager_jni.h"
 #include "third_party/libaddressinput/chromium/chrome_metadata_source.h"
 #include "third_party/libaddressinput/chromium/chrome_storage_impl.h"
-#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"
 
 using base::android::ConvertJavaStringToUTF8;
 using base::android::ConvertUTF16ToJavaString;
@@ -273,42 +273,36 @@
   DISALLOW_COPY_AND_ASSIGN(FullCardRequester);
 };
 
-class AddressNormalizationRequester
-    : public PersonalDataManagerAndroid::Delegate,
-      public base::SupportsWeakPtr<AddressNormalizationRequester> {
+class AndroidAddressNormalizerDelegate
+    : public ::payments::AddressNormalizer::Delegate,
+      public base::SupportsWeakPtr<AndroidAddressNormalizerDelegate> {
  public:
-  AddressNormalizationRequester(
+  AndroidAddressNormalizerDelegate(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jdelegate,
-      const std::string& region_code,
-      const std::string& guid,
-      base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android) {
+      const base::android::JavaParamRef<jobject>& jdelegate) {
     jdelegate_.Reset(env, jdelegate);
-    region_code_ = region_code;
-    guid_ = guid;
-    personal_data_manager_android_ = personal_data_manager_android;
-    env_ = env;
+  }
+
+  void OnAddressNormalized(const AutofillProfile& normalized_profile) override {
+    JNIEnv* env = base::android::AttachCurrentThread();
+    Java_NormalizedAddressRequestDelegate_onAddressNormalized(
+        env, jdelegate_, CreateJavaProfileFromNative(env, normalized_profile));
+    delete this;
+  }
+
+  void OnCouldNotNormalize(const AutofillProfile& profile) override {
+    JNIEnv* env = base::android::AttachCurrentThread();
+    Java_NormalizedAddressRequestDelegate_onCouldNotNormalize(
+        env, jdelegate_, CreateJavaProfileFromNative(env, profile));
+    delete this;
   }
 
  private:
-  ~AddressNormalizationRequester() override {}
-
-  void OnRulesSuccessfullyLoaded() override {
-    if (personal_data_manager_android_) {
-      JNIEnv* env = base::android::AttachCurrentThread();
-      Java_NormalizedAddressRequestDelegate_onAddressNormalized(
-          env, jdelegate_, personal_data_manager_android_->NormalizeAddress(
-                               guid_, region_code_, env));
-    }
-  }
+  ~AndroidAddressNormalizerDelegate() override {}
 
   ScopedJavaGlobalRef<jobject> jdelegate_;
-  std::string guid_;
-  std::string region_code_;
-  base::WeakPtr<PersonalDataManagerAndroid> personal_data_manager_android_;
-  JNIEnv* env_;
 
-  DISALLOW_COPY_AND_ASSIGN(AddressNormalizationRequester);
+  DISALLOW_COPY_AND_ASSIGN(AndroidAddressNormalizerDelegate);
 };
 
 }  // namespace
@@ -317,13 +311,12 @@
     : weak_java_obj_(env, obj),
       personal_data_manager_(PersonalDataManagerFactory::GetForProfile(
           ProfileManager::GetActiveUserProfile())),
-      address_validator_(
+      address_normalizer_(
           std::unique_ptr<::i18n::addressinput::Source>(
               new autofill::ChromeMetadataSource(
                   I18N_ADDRESS_VALIDATION_DATA_URL,
                   personal_data_manager_->GetURLRequestContextGetter())),
-          ValidationRulesStorageFactory::CreateStorage(),
-          this) {
+          ValidationRulesStorageFactory::CreateStorage()) {
   personal_data_manager_->AddObserver(this);
 }
 
@@ -708,22 +701,11 @@
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& unused_obj,
     const base::android::JavaParamRef<jstring>& jregion_code) {
-  address_validator_.LoadRules(ConvertJavaStringToUTF8(env, jregion_code));
+  address_normalizer_.LoadRulesForRegion(
+      ConvertJavaStringToUTF8(env, jregion_code));
 }
 
-void PersonalDataManagerAndroid::OnAddressValidationRulesLoaded(
-    const std::string& region_code,
-    bool success) {
-  // Check if an address normalization is pending.
-  auto it = pending_normalization_.find(region_code);
-  if (it != pending_normalization_.end()) {
-    for (size_t i = 0; i < it->second.size(); ++i)
-      it->second[i]->OnRulesSuccessfullyLoaded();
-    pending_normalization_.erase(it);
-  }
-}
-
-jboolean PersonalDataManagerAndroid::StartAddressNormalization(
+void PersonalDataManagerAndroid::StartAddressNormalization(
     JNIEnv* env,
     const JavaParamRef<jobject>& unused_obj,
     const JavaParamRef<jstring>& jguid,
@@ -732,62 +714,16 @@
   const std::string region_code = ConvertJavaStringToUTF8(env, jregion_code);
   const std::string guid = ConvertJavaStringToUTF8(env, jguid);
 
-  std::unique_ptr<Delegate> requester(new AddressNormalizationRequester(
-      env, jdelegate, region_code, guid, AsWeakPtr()));
-
-  // Check if the rules are already loaded.
-  if (AreRulesLoadedForRegion(region_code)) {
-    requester->OnRulesSuccessfullyLoaded();
-    return false;
-  } else {
-    // Setup the variables so the profile gets normalized when the rules have
-    // finished loading.
-    auto it = pending_normalization_.find(region_code);
-    if (it == pending_normalization_.end()) {
-      // If no entry exists yet, create the entry and assign it to |it|.
-      it = pending_normalization_
-               .insert(std::make_pair(region_code,
-                                      std::vector<std::unique_ptr<Delegate>>()))
-               .first;
-    }
-
-    it->second.push_back(std::move(requester));
-
-    return true;
-  }
-}
-
-ScopedJavaLocalRef<jobject> PersonalDataManagerAndroid::NormalizeAddress(
-    const std::string& guid,
-    const std::string& region_code,
-    JNIEnv* env) {
+  // Get the profile to normalize.
   AutofillProfile* profile = personal_data_manager_->GetProfileByGUID(guid);
 
-  if (!profile || !AreRulesLoadedForRegion(region_code))
-    return nullptr;
+  // Self-deleting object.
+  AndroidAddressNormalizerDelegate* requester =
+      new AndroidAddressNormalizerDelegate(env, jdelegate);
 
-  // Create the AddressData from the profile.
-  ::i18n::addressinput::AddressData address_data =
-      *i18n::CreateAddressDataFromAutofillProfile(
-          *profile, personal_data_manager_->app_locale());
-
-  // Normalize the address.
-  if (address_validator_.NormalizeAddress(&address_data)) {
-    profile->SetRawInfo(ADDRESS_HOME_STATE,
-                        base::UTF8ToUTF16(address_data.administrative_area));
-    profile->SetRawInfo(ADDRESS_HOME_CITY,
-                        base::UTF8ToUTF16(address_data.locality));
-    profile->SetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY,
-                        base::UTF8ToUTF16(address_data.dependent_locality));
-  }
-
-  return CreateJavaProfileFromNative(env, *profile);
-}
-
-void PersonalDataManagerAndroid::CancelPendingAddressNormalizations(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& unused_obj) {
-  pending_normalization_.clear();
+  // Start the normalization.
+  address_normalizer_.StartAddressNormalization(*profile, region_code,
+                                                requester);
 }
 
 jboolean PersonalDataManagerAndroid::HasProfiles(
@@ -824,7 +760,7 @@
 
 bool PersonalDataManagerAndroid::AreRulesLoadedForRegion(
     const std::string& region_code) {
-  return address_validator_.AreRulesLoadedForRegion(region_code);
+  return address_normalizer_.AreRulesLoadedForRegion(region_code);
 }
 
 ScopedJavaLocalRef<jobjectArray> PersonalDataManagerAndroid::GetProfileLabels(
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.h b/chrome/browser/autofill/android/personal_data_manager_android.h
index 9973f12f..10c7b12 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.h
+++ b/chrome/browser/autofill/android/personal_data_manager_android.h
@@ -9,28 +9,17 @@
 #include "base/android/scoped_java_ref.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/autofill/validation_rules_storage_factory.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill/core/browser/personal_data_manager_observer.h"
-#include "third_party/libaddressinput/chromium/chrome_address_validator.h"
+#include "components/payments/address_normalizer.h"
 
 namespace autofill {
 
 // Android wrapper of the PersonalDataManager which provides access from the
 // Java layer. Note that on Android, there's only a single profile, and
 // therefore a single instance of this wrapper.
-class PersonalDataManagerAndroid
-    : public PersonalDataManagerObserver,
-      public LoadRulesListener,
-      public base::SupportsWeakPtr<PersonalDataManagerAndroid> {
+class PersonalDataManagerAndroid : public PersonalDataManagerObserver {
  public:
-  // The interface for the normalization request.
-  class Delegate {
-   public:
-    virtual void OnRulesSuccessfullyLoaded() = 0;
-    virtual ~Delegate() {}
-  };
-
   PersonalDataManagerAndroid(JNIEnv* env, jobject obj);
 
   // Returns true if personal data manager has loaded the initial data.
@@ -300,36 +289,18 @@
       const base::android::JavaParamRef<jobject>& unused_obj,
       const base::android::JavaParamRef<jstring>& region_code);
 
-  // Callback of the address validator that is called when the validator has
-  // finished loading the rules for a region.
-  void OnAddressValidationRulesLoaded(const std::string& region_code,
-                                      bool success) override;
-
   // Normalizes the address of the profile associated with the |jguid|
   // synchronously if the |jregion_code| rules have finished loading. Otherwise
   // sets up the task to start the address normalization when the rules have
   // finished loading. In either case, sends the normalized profile to the
-  // |jdelegate|. Returns whether the normalization will happen asynchronously.
-  jboolean StartAddressNormalization(
+  // |jdelegate|.
+  void StartAddressNormalization(
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& unused_obj,
       const base::android::JavaParamRef<jstring>& jguid,
       const base::android::JavaParamRef<jstring>& jregion_code,
       const base::android::JavaParamRef<jobject>& jdelegate);
 
-  // Normalizes the address of the profile associated with the |guid| with the
-  // rules associates with the |region_code|. Should only be called when the
-  // rules have finished loading.
-  base::android::ScopedJavaLocalRef<jobject> NormalizeAddress(
-      const std::string& guid,
-      const std::string& region_code,
-      JNIEnv* env);
-
-  // Cancels the pending address normalization task.
-  void CancelPendingAddressNormalizations(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& unused_obj);
-
   // Checks whether the Autofill PersonalDataManager has profiles.
   jboolean HasProfiles(JNIEnv* env,
                        const base::android::JavaParamRef<jobject>& unused_obj);
@@ -387,11 +358,7 @@
   PersonalDataManager* personal_data_manager_;
 
   // The address validator used to normalize addresses.
-  AddressValidator address_validator_;
-
-  // Map associating a region code to pending normalizations.
-  std::map<std::string, std::vector<std::unique_ptr<Delegate>>>
-      pending_normalization_;
+  payments::AddressNormalizer address_normalizer_;
 
   DISALLOW_COPY_AND_ASSIGN(PersonalDataManagerAndroid);
 };
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 69b2b5f..5912d57 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2659,13 +2659,16 @@
   web_prefs->data_saver_enabled = GetDataSaverEnabledPref(prefs);
 
 #if defined(OS_ANDROID)
-  content::WebContents* contents =
-      content::WebContents::FromRenderViewHost(rvh);
-  if (contents) {
-    TabAndroid* tab_android = TabAndroid::FromWebContents(contents);
-    if (tab_android) {
-      web_prefs->media_playback_gesture_whitelist_scope =
-          tab_android->GetWebappManifestScope();
+  if (base::FeatureList::IsEnabled(
+          features::kAllowAutoplayUnmutedInWebappManifestScope)) {
+    content::WebContents* contents =
+        content::WebContents::FromRenderViewHost(rvh);
+    if (contents) {
+      TabAndroid* tab_android = TabAndroid::FromWebContents(contents);
+      if (tab_android) {
+        web_prefs->media_playback_gesture_whitelist_scope =
+            tab_android->GetWebappManifestScope();
+      }
     }
   }
 #endif  // defined(OS_ANDROID)
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc
index 1e9354c0..48568e76 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.cc
@@ -34,7 +34,7 @@
 
 // Preference for the dictionary of user ids for which cryptohomes have to be
 // removed upon browser restart.
-const char kArcKioskUsersToRemove[] = "arc-kiosk-users-to-remove";
+constexpr char kArcKioskUsersToRemove[] = "arc-kiosk-users-to-remove";
 
 void ScheduleDelayedCryptohomeRemoval(const cryptohome::Identification& id) {
   PrefService* const local_state = g_browser_process->local_state();
@@ -117,7 +117,7 @@
     const std::string& name)
     : app_info_(app_info), account_id_(account_id), name_(name) {}
 
-ArcKioskAppManager::ArcKioskApp::~ArcKioskApp() {}
+ArcKioskAppManager::ArcKioskApp::~ArcKioskApp() = default;
 
 bool ArcKioskAppManager::ArcKioskApp::operator==(
     const policy::ArcKioskAppBasicInfo& app_info) const {
@@ -191,25 +191,27 @@
   // Re-populates |apps_| and reuses existing apps when possible.
   const std::vector<policy::DeviceLocalAccount> device_local_accounts =
       policy::GetDeviceLocalAccounts(CrosSettings::Get());
-  for (std::vector<policy::DeviceLocalAccount>::const_iterator it =
-           device_local_accounts.begin();
-       it != device_local_accounts.end(); ++it) {
-    if (it->type != policy::DeviceLocalAccount::TYPE_ARC_KIOSK_APP)
+  for (auto account : device_local_accounts) {
+    if (account.type != policy::DeviceLocalAccount::TYPE_ARC_KIOSK_APP)
       continue;
 
-    const AccountId account_id(AccountId::FromUserEmail(it->user_id));
+    const AccountId account_id(AccountId::FromUserEmail(account.user_id));
 
-    if (it->account_id == auto_login_account_id_from_settings)
+    if (account.account_id == auto_login_account_id_from_settings)
       auto_launch_account_id_ = account_id;
 
     auto old_it =
-        std::find(old_apps.begin(), old_apps.end(), it->arc_kiosk_app_info);
+        std::find(old_apps.begin(), old_apps.end(), account.arc_kiosk_app_info);
     if (old_it != old_apps.end()) {
       apps_.push_back(std::move(*old_it));
       old_apps.erase(old_it);
     } else {
-      apps_.push_back(ArcKioskApp(it->arc_kiosk_app_info, account_id,
-                                  it->arc_kiosk_app_info.package_name()));
+      // Use package name when display name is not specified.
+      std::string name = account.arc_kiosk_app_info.package_name();
+      if (!account.arc_kiosk_app_info.display_name().empty())
+        name = account.arc_kiosk_app_info.display_name();
+      apps_.push_back(
+          ArcKioskApp(account.arc_kiosk_app_info, account_id, name));
     }
     CancelDelayedCryptohomeRemoval(cryptohome::Identification(account_id));
   }
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h
index ec9ef5a..a81da14 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager.h
@@ -55,7 +55,7 @@
     virtual void OnArcKioskAppsChanged() {}
 
    protected:
-    virtual ~ArcKioskAppManagerObserver() {}
+    virtual ~ArcKioskAppManagerObserver() = default;
   };
 
   static ArcKioskAppManager* Get();
diff --git a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager_browsertest.cc b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager_browsertest.cc
index 6586c01..f334af7 100644
--- a/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager_browsertest.cc
+++ b/chrome/browser/chromeos/app_mode/arc/arc_kiosk_app_manager_browsertest.cc
@@ -114,6 +114,9 @@
           kAccountsPrefDeviceLocalAccountsKeyArcKioskClass, app.class_name());
       entry->SetStringWithoutPathExpansion(
           kAccountsPrefDeviceLocalAccountsKeyArcKioskAction, app.action());
+      entry->SetStringWithoutPathExpansion(
+          kAccountsPrefDeviceLocalAccountsKeyArcKioskDisplayName,
+          app.display_name());
       device_local_accounts.Append(std::move(entry));
     }
     owner_settings_service_->Set(kAccountsPrefDeviceLocalAccounts,
@@ -142,10 +145,9 @@
 };
 
 IN_PROC_BROWSER_TEST_F(ArcKioskAppManagerTest, Basic) {
-  policy::ArcKioskAppBasicInfo app1("com.package.name1", std::string(),
-                                    std::string());
-  policy::ArcKioskAppBasicInfo app2("com.package.name2", std::string(),
-                                    std::string());
+  policy::ArcKioskAppBasicInfo app1("com.package.name1", "", "", "");
+  policy::ArcKioskAppBasicInfo app2("com.package.name2", "", "",
+                                    "display name");
   std::vector<policy::ArcKioskAppBasicInfo> init_apps{app1, app2};
 
   // Set initial list of apps.
@@ -160,6 +162,8 @@
     ASSERT_EQ(2u, apps.size());
     ASSERT_EQ(app1, apps[0].app_info());
     ASSERT_EQ(app2, apps[1].app_info());
+    ASSERT_EQ(app1.package_name(), apps[0].name());
+    ASSERT_EQ(app2.display_name(), apps[1].name());
     EXPECT_FALSE(manager()->GetAutoLaunchAccountId().is_valid());
   }
 
@@ -178,14 +182,15 @@
     ArcKioskAppManager::ArcKioskApps apps = manager()->GetAllApps();
     ASSERT_EQ(app1, apps[0].app_info());
     ASSERT_EQ(app2, apps[1].app_info());
+    ASSERT_EQ(app1.package_name(), apps[0].name());
+    ASSERT_EQ(app2.display_name(), apps[1].name());
     EXPECT_TRUE(manager()->GetAutoLaunchAccountId().is_valid());
     ASSERT_EQ(apps[1].account_id(), manager()->GetAutoLaunchAccountId());
   }
 
   // Create a new list of apps, where there is no app2 (is auto launch now),
   // and present a new app.
-  policy::ArcKioskAppBasicInfo app3("com.package.name3", std::string(),
-                                    std::string());
+  policy::ArcKioskAppBasicInfo app3("com.package.name3", "", "", "");
   std::vector<policy::ArcKioskAppBasicInfo> new_apps{app1, app3};
   {
     // Observer must be notified once: app list was updated.
@@ -198,6 +203,8 @@
     ASSERT_EQ(2u, apps.size());
     ASSERT_EQ(app1, apps[0].app_info());
     ASSERT_EQ(app3, apps[1].app_info());
+    ASSERT_EQ(app1.package_name(), apps[0].name());
+    ASSERT_EQ(app3.package_name(), apps[1].name());
     // Auto launch app must be reset.
     EXPECT_FALSE(manager()->GetAutoLaunchAccountId().is_valid());
   }
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 7410beb..46883134 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -144,6 +144,7 @@
 #include "content/public/browser/notification_service.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/main_function_params.h"
+#include "dbus/object_path.h"
 #include "device/bluetooth/bluetooth_adapter_factory.h"
 #include "device/bluetooth/dbus/bluez_dbus_manager.h"
 #include "media/audio/sounds/sounds_manager.h"
@@ -152,6 +153,7 @@
 #include "net/url_request/url_request_context_getter.h"
 #include "printing/backend/print_backend.h"
 #include "rlz/features/features.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
 #include "ui/base/ime/chromeos/ime_keyboard.h"
 #include "ui/base/ime/chromeos/input_method_manager.h"
 #include "ui/base/touch/touch_device.h"
@@ -244,7 +246,9 @@
           base::MakeUnique<ChromeConsoleServiceProviderDelegate>()));
     }
     service_providers.push_back(base::MakeUnique<KioskInfoService>());
-    CrosDBusService::Initialize(std::move(service_providers));
+    cros_dbus_service_ = CrosDBusService::Create(
+        kLibCrosServiceName, dbus::ObjectPath(kLibCrosServicePath),
+        std::move(service_providers));
 
     // Initialize PowerDataCollector after DBusThreadManager is initialized.
     PowerDataCollector::Initialize();
@@ -294,7 +298,7 @@
     LoginState::Shutdown();
     CertLoader::Shutdown();
     TPMTokenLoader::Shutdown();
-    CrosDBusService::Shutdown();
+    cros_dbus_service_.reset();
     PowerDataCollector::Shutdown();
     PowerPolicyController::Shutdown();
     device::BluetoothAdapterFactory::Shutdown();
@@ -305,6 +309,13 @@
   }
 
  private:
+  // Hosts providers for the "org.chromium.LibCrosService" D-Bus service owned
+  // by Chrome. The name of this service was chosen for historical reasons that
+  // are irrelevant now.
+  // TODO(derat): Move these providers into more-specific services that are
+  // split between different processes: http://crbug.com/692246
+  std::unique_ptr<CrosDBusService> cros_dbus_service_;
+
   std::unique_ptr<NetworkConnectDelegateChromeOS> network_connect_delegate_;
 
   DISALLOW_COPY_AND_ASSIGN(DBusServices);
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index 8e5aca8..b9b8bab 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -733,21 +733,12 @@
 }
 
 void WizardController::OnUpdateErrorCheckingForUpdate() {
-  const bool is_hands_off_mode =
-      (policy::DeviceCloudPolicyManagerChromeOS::GetZeroTouchEnrollmentMode() ==
-       policy::ZeroTouchEnrollmentMode::HANDS_OFF);
-
-  // If there was an error while checking for update, return to the network
-  // selection screen if the OOBE isn't complete (unless it's in the zero-touch
-  // enrollment mode)  as we don't want to miss any critical update. Otherwise,
-  // we do not want to block users from being able to proceed to the login
-  // screen if there is any error checking for an update. They could use
-  // "browse without sign-in" feature to set up the network to be able to
-  // perform the update later.
-  if (is_out_of_box_ && !is_hands_off_mode)
-    ShowNetworkScreen();
-  else
-    OnUpdateCompleted();
+  // TODO(nkostylev): Update should be required during OOBE.
+  // We do not want to block users from being able to proceed to the login
+  // screen if there is any error checking for an update.
+  // They could use "browse without sign-in" feature to set up the network to be
+  // able to perform the update later.
+  OnUpdateCompleted();
 }
 
 void WizardController::OnUpdateErrorUpdating(bool is_critical_update) {
diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
index 1cc76e3..47988a3 100644
--- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
@@ -592,38 +592,6 @@
                                   ->GetCurrentTimezoneID()));
 }
 
-// This test verifies that if WizardController fails to check for update before
-// the OOBE is marked complete, it goes back the network selection screen and
-// thus prevents the user from proceeding to log in.
-IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest,
-                       ControlFlowErrorCheckingForUpdate) {
-  CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
-  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(0);
-  EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
-  EXPECT_CALL(*mock_update_screen_, Show()).Times(0);
-  EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
-  OnExit(*mock_network_screen_, BaseScreenDelegate::NETWORK_CONNECTED);
-
-  CheckCurrentScreen(OobeScreen::SCREEN_OOBE_EULA);
-  EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
-  EXPECT_CALL(*mock_update_screen_, StartNetworkCheck()).Times(1);
-  EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
-  OnExit(*mock_eula_screen_, BaseScreenDelegate::EULA_ACCEPTED);
-
-  // Let update screen smooth time process (time = 0ms).
-  content::RunAllPendingInMessageLoop();
-
-  CheckCurrentScreen(OobeScreen::SCREEN_OOBE_UPDATE);
-  EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
-  EXPECT_CALL(*mock_eula_screen_, Show()).Times(0);
-  EXPECT_CALL(*mock_auto_enrollment_check_screen_, Show()).Times(0);
-  EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
-  EXPECT_CALL(*mock_network_screen_, Hide()).Times(0);  // last transition
-  OnExit(*mock_update_screen_,
-         BaseScreenDelegate::UPDATE_ERROR_CHECKING_FOR_UPDATE);
-  CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
-}
-
 // This test verifies that if WizardController fails to apply a non-critical
 // update before the OOBE is marked complete, it allows the user to proceed to
 // log in.
@@ -799,9 +767,9 @@
   DISALLOW_COPY_AND_ASSIGN(WizardControllerErrorUpdateAfterCompletedOobeTest);
 };
 
-// This test verifies that if WizardController fails to check for update or
-// apply an update (either critical or non-critical) after the OOBE is marked
-// complete, it allows the user to proceed to log in.
+// This test verifies that if WizardController fails to apply an update, either
+// critical or non-critical, after the OOBE is marked complete, it allows the
+// user to proceed to log in.
 IN_PROC_BROWSER_TEST_P(WizardControllerErrorUpdateAfterCompletedOobeTest,
                        ControlFlowErrorUpdate) {
   const BaseScreenDelegate::ExitCodes update_screen_exit_code = GetParam();
@@ -838,8 +806,7 @@
 INSTANTIATE_TEST_CASE_P(
     WizardControllerErrorUpdateAfterCompletedOobe,
     WizardControllerErrorUpdateAfterCompletedOobeTest,
-    testing::Values(BaseScreenDelegate::UPDATE_ERROR_CHECKING_FOR_UPDATE,
-                    BaseScreenDelegate::UPDATE_ERROR_UPDATING,
+    testing::Values(BaseScreenDelegate::UPDATE_ERROR_UPDATING,
                     BaseScreenDelegate::UPDATE_ERROR_UPDATING_CRITICAL_UPDATE));
 
 class WizardControllerDeviceStateTest : public WizardControllerFlowTest {
diff --git a/chrome/browser/chromeos/policy/device_local_account.cc b/chrome/browser/chromeos/policy/device_local_account.cc
index 5613ebc..303f049 100644
--- a/chrome/browser/chromeos/policy/device_local_account.cc
+++ b/chrome/browser/chromeos/policy/device_local_account.cc
@@ -35,8 +35,12 @@
 
 ArcKioskAppBasicInfo::ArcKioskAppBasicInfo(const std::string& package_name,
                                            const std::string& class_name,
-                                           const std::string& action)
-    : package_name_(package_name), class_name_(class_name), action_(action) {}
+                                           const std::string& action,
+                                           const std::string& display_name)
+    : package_name_(package_name),
+      class_name_(class_name),
+      action_(action),
+      display_name_(display_name) {}
 
 ArcKioskAppBasicInfo::ArcKioskAppBasicInfo(const ArcKioskAppBasicInfo& other) =
     default;
@@ -48,7 +52,8 @@
 bool ArcKioskAppBasicInfo::operator==(const ArcKioskAppBasicInfo& other) const {
   return this->package_name_ == other.package_name_ &&
          this->action_ == other.action_ &&
-         this->class_name_ == other.class_name_;
+         this->class_name_ == other.class_name_ &&
+         this->display_name_ == other.display_name_;
 }
 
 DeviceLocalAccount::DeviceLocalAccount(Type type,
@@ -170,6 +175,11 @@
             chromeos::kAccountsPrefDeviceLocalAccountsKeyArcKioskAction,
             it->arc_kiosk_app_info.action());
       }
+      if (!it->arc_kiosk_app_info.display_name().empty()) {
+        entry->SetStringWithoutPathExpansion(
+            chromeos::kAccountsPrefDeviceLocalAccountsKeyArcKioskDisplayName,
+            it->arc_kiosk_app_info.display_name());
+      }
     }
     list.Append(std::move(entry));
   }
@@ -250,6 +260,7 @@
         std::string package_name;
         std::string class_name;
         std::string action;
+        std::string display_name;
         if (!entry->GetStringWithoutPathExpansion(
                 chromeos::kAccountsPrefDeviceLocalAccountsKeyArcKioskPackage,
                 &package_name)) {
@@ -264,8 +275,11 @@
         entry->GetStringWithoutPathExpansion(
             chromeos::kAccountsPrefDeviceLocalAccountsKeyArcKioskAction,
             &action);
+        entry->GetStringWithoutPathExpansion(
+            chromeos::kAccountsPrefDeviceLocalAccountsKeyArcKioskDisplayName,
+            &display_name);
         const ArcKioskAppBasicInfo arc_kiosk_app(package_name, class_name,
-                                                 action);
+                                                 action, display_name);
 
         accounts.push_back(DeviceLocalAccount(arc_kiosk_app, account_id));
         break;
diff --git a/chrome/browser/chromeos/policy/device_local_account.h b/chrome/browser/chromeos/policy/device_local_account.h
index 1613ada1..bc7b59adf 100644
--- a/chrome/browser/chromeos/policy/device_local_account.h
+++ b/chrome/browser/chromeos/policy/device_local_account.h
@@ -18,7 +18,8 @@
 struct ArcKioskAppBasicInfo {
   ArcKioskAppBasicInfo(const std::string& package_name,
                        const std::string& class_name,
-                       const std::string& action);
+                       const std::string& action,
+                       const std::string& display_name);
   ArcKioskAppBasicInfo(const ArcKioskAppBasicInfo& other);
   ArcKioskAppBasicInfo();
   ~ArcKioskAppBasicInfo();
@@ -28,11 +29,13 @@
   const std::string& package_name() const { return package_name_; }
   const std::string& class_name() const { return class_name_; }
   const std::string& action() const { return action_; }
+  const std::string& display_name() const { return display_name_; }
 
  private:
   std::string package_name_;
   std::string class_name_;
   std::string action_;
+  std::string display_name_;
 };
 
 // This must match DeviceLocalAccountInfoProto.AccountType in
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index 7e1dc1e..201b08d 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -221,6 +221,11 @@
               chromeos::kAccountsPrefDeviceLocalAccountsKeyArcKioskAction,
               entry.android_kiosk_app().action());
         }
+        if (entry.android_kiosk_app().has_display_name()) {
+          entry_dict->SetStringWithoutPathExpansion(
+              chromeos::kAccountsPrefDeviceLocalAccountsKeyArcKioskDisplayName,
+              entry.android_kiosk_app().display_name());
+        }
       } else if (entry.has_deprecated_public_session_id()) {
         // Deprecated public session specification.
         entry_dict->SetStringWithoutPathExpansion(
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index e954622d..a08da6c 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -221,6 +221,11 @@
             chromeos::kAccountsPrefDeviceLocalAccountsKeyArcKioskAction,
             entry->android_kiosk_app().action());
       }
+      if (entry->android_kiosk_app().has_display_name()) {
+        entry_dict->SetStringWithoutPathExpansion(
+            chromeos::kAccountsPrefDeviceLocalAccountsKeyArcKioskDisplayName,
+            entry->android_kiosk_app().display_name());
+      }
     } else if (entry->has_deprecated_public_session_id()) {
       // Deprecated public session specification.
       entry_dict->SetStringWithoutPathExpansion(
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
index 40f4f5c4..3f3479e 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_apitest.cc
@@ -75,8 +75,8 @@
       return true;
 #endif
 
-    // The tests are too slow to succeed with OSMesa on the bots.
-    if (UsingOSMesa())
+    // The tests are too slow to succeed with software GL on the bots.
+    if (UsingSoftwareGL())
       return true;
 
 #if defined(NDEBUG)
diff --git a/chrome/browser/intranet_redirect_detector.cc b/chrome/browser/intranet_redirect_detector.cc
index 7de513e4..2dd45da 100644
--- a/chrome/browser/intranet_redirect_detector.cc
+++ b/chrome/browser/intranet_redirect_detector.cc
@@ -83,13 +83,13 @@
         semantics {
           sender: "Intranet Redirect Detector"
           description:
-            "This component sends a request to a randomly generated and "
-            "therefore unlikely to exist URL. If Chrome receives a valid HTTP "
-            "response, this indicates that the computer is behind a gateway, "
-            "e.g., in a hotel where the user needs to pay for internet access. "
-            "Chrome can prompt the user to login to the gateway to unlock "
-            "access to the web."
-          trigger: "When IP address of the computer changes."
+            "This component sends requests to three randomly generated, and "
+            "thus likely nonexistent, hostnames.  If at least two redirect to "
+            "the same hostname, this suggests the ISP is hijacking NXDOMAIN, "
+            "and the omnibox should treat similar redirected navigations as "
+            "'failed' when deciding whether to prompt the user with a 'did you "
+            "mean to navigate' infobar for certain search inputs."
+          trigger: "On startup and when IP address of the computer changes."
           data: "None, this is just an empty request."
           destination: OTHER
         }
diff --git a/chrome/browser/printing/print_dialog_cloud_win.cc b/chrome/browser/printing/print_dialog_cloud_win.cc
index 71f776b2..d868b776 100644
--- a/chrome/browser/printing/print_dialog_cloud_win.cc
+++ b/chrome/browser/printing/print_dialog_cloud_win.cc
@@ -74,8 +74,7 @@
     if (cloud_devices::IsCloudPrintURL(url)) {
       base::string16 origin = base::UTF8ToUTF16(url.GetOrigin().spec());
       content::MessagePortProvider::PostMessageToFrame(
-          web_contents(), origin, origin, message_data_,
-          std::vector<int>());
+          web_contents(), origin, origin, message_data_);
     }
   }
 
diff --git a/chrome/browser/resources/options/compiled_resources.gyp b/chrome/browser/resources/options/compiled_resources.gyp
index 0c4f64c..4ec0fcd 100644
--- a/chrome/browser/resources/options/compiled_resources.gyp
+++ b/chrome/browser/resources/options/compiled_resources.gyp
@@ -45,6 +45,7 @@
           '../../../../chrome/browser/resources/chromeos/keyboard/keyboard_utils.js',
           '../../../../ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior',
           '../settings/compiled_resources2.gyp:route',
+          '../settings/people_page/compiled_resources2.gyp:fingerprint_browser_proxy',
           '../settings/people_page/compiled_resources2.gyp:lock_screen_constants',
           '../settings/people_page/compiled_resources2.gyp:lock_state_behavior',
           '../settings/people_page/compiled_resources2.gyp:password_prompt_dialog',
diff --git a/chrome/browser/resources/settings/people_page/compiled_resources2.gyp b/chrome/browser/resources/settings/people_page/compiled_resources2.gyp
index 17ad19b..1c3a3b6 100644
--- a/chrome/browser/resources/settings/people_page/compiled_resources2.gyp
+++ b/chrome/browser/resources/settings/people_page/compiled_resources2.gyp
@@ -58,6 +58,17 @@
       'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
     },
     {
+      'target_name': 'fingerprint_list',
+      'dependencies': [
+        '<(DEPTH)/third_party/polymer/v1_0/components-chromium/iron-resizable-behavior/compiled_resources2.gyp:iron-resizable-behavior-extracted',
+        '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
+        '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:i18n_behavior',
+
+	'fingerprint_browser_proxy',
+      ],
+      'includes': ['../../../../../third_party/closure_compiler/compile_js2.gypi'],
+    },
+    {
       'target_name': 'import_data_browser_proxy',
       'dependencies': [
         '<(DEPTH)/ui/webui/resources/js/compiled_resources2.gyp:cr',
@@ -136,6 +147,7 @@
       'target_name': 'lock_screen',
       'dependencies': [
         '../compiled_resources2.gyp:route',
+        'fingerprint_browser_proxy',
 	'lock_screen_constants',
         'lock_state_behavior',
         'password_prompt_dialog',
diff --git a/chrome/browser/resources/settings/people_page/fingerprint_browser_proxy.js b/chrome/browser/resources/settings/people_page/fingerprint_browser_proxy.js
index 6b59ee8..5b486543 100644
--- a/chrome/browser/resources/settings/people_page/fingerprint_browser_proxy.js
+++ b/chrome/browser/resources/settings/people_page/fingerprint_browser_proxy.js
@@ -33,7 +33,7 @@
  * settings. The structure of this data must be kept in sync with
  * C++ FingerprintHandler.
  * @typedef {{
- *   fingerprintsList: Array<number>,
+ *   fingerprintsList: !Array<string>,
  *   isMaxed: boolean,
  * }}
  */
@@ -45,10 +45,15 @@
 
   FingerprintBrowserProxy.prototype = {
     /**
-     * @return {!Promise<!Array<!settings.FingerprintInfo>>}
+     * @return {!Promise<!settings.FingerprintInfo>}
      */
     getFingerprintsList: function () {},
 
+    /**
+     * @return {!Promise<number>}
+     */
+    getNumFingerprints: function () {},
+
     startEnroll: function () {},
 
     cancelCurrentEnroll: function() {},
@@ -97,6 +102,11 @@
     },
 
     /** @override */
+    getNumFingerprints: function () {
+      return cr.sendWithPromise('getNumFingerprints');
+    },
+
+    /** @override */
     startEnroll: function () {
       chrome.send('startEnroll');
     },
diff --git a/chrome/browser/resources/settings/people_page/fingerprint_list.html b/chrome/browser/resources/settings/people_page/fingerprint_list.html
index 4b00560..3467130 100644
--- a/chrome/browser/resources/settings/people_page/fingerprint_list.html
+++ b/chrome/browser/resources/settings/people_page/fingerprint_list.html
@@ -11,27 +11,49 @@
 
 <dom-module id="settings-fingerprint-list">
   <template>
-    <style include="settings-shared"></style>
+    <style include="settings-shared">
+      .add-link {
+        background-color: transparent;
+        color: var(--google-blue-500);
+        padding: 0;
+      }
 
-    <div>$i18n{lockScreenRegisteredFingerprints}</div>
-    <iron-list id="fingerprintsList" items="[[fingerprints_]]">
-      <template>
-        <div class="list-item">
-          <paper-input value="{{item}}" on-change="onFingerprintLabelChanged_">
-          </paper-input>
-          <button is="paper-icon-button-light"
-              on-tap="onFingerprintDeleteTapped_">
-            <iron-icon icon="cr:delete"></iron-icon>
-          </button>
-        </div>
-      </template>
-    </iron-list>
-    <div class="settings-box first radio-indent">
-      <paper-button class="action-button" on-tap="openAddFingerprintDialog_">
-        $i18n{lockScreenAddFingerprint}
-      </paper-button>
+      .add-link[disabled] {
+        color: var(--google-grey-500);
+      }
+
+      .body {
+        @apply(--settings-list-frame-padding);
+      }
+
+      paper-input {
+        --paper-input-container-color: transparent;
+      }
+    </style>
+
+    <h2 class="settings-box">$i18n{lockScreenRegisteredFingerprints}</h2>
+    <div class="body layout vertical">
+      <iron-list id="fingerprintsList" items="[[fingerprints_]]">
+        <template>
+          <div class="list-item">
+            <paper-input value="{{item}}"
+                on-change="onFingerprintLabelChanged_">
+            </paper-input>
+            <button is="paper-icon-button-light"
+                on-tap="onFingerprintDeleteTapped_">
+              <iron-icon icon="cr:delete"></iron-icon>
+            </button>
+          </div>
+        </template>
+      </iron-list>
+      <div class="continuation">
+        <paper-button class="add-link action-button"
+            on-tap="openAddFingerprintDialog_">
+          $i18n{lockScreenAddFingerprint}
+        </paper-button>
+      </div>
     </div>
-    <i>$i18n{lockScreenFingerprintWarning}</i>
+    <i class="settings-box continuation">$i18n{lockScreenFingerprintWarning}</i>
 
     <settings-setup-fingerprint-dialog id="setupFingerprint"
         on-add-fingerprint="updateFingerprintsList_">
diff --git a/chrome/browser/resources/settings/people_page/fingerprint_list.js b/chrome/browser/resources/settings/people_page/fingerprint_list.js
index 3c88f8b..439ed478f 100644
--- a/chrome/browser/resources/settings/people_page/fingerprint_list.js
+++ b/chrome/browser/resources/settings/people_page/fingerprint_list.js
@@ -25,7 +25,7 @@
     }
   },
 
-  /** @private {?settings.FingerprintBrowserProxy}*/
+  /** @private {?settings.FingerprintBrowserProxy} */
   browserProxy_: null,
 
   /** @override */
@@ -41,7 +41,7 @@
   },
 
   /**
-   * @param {settings.FingerprintInfo} fingerprintsInfo
+   * @param {!settings.FingerprintInfo} fingerprintInfo
    * @private
    * */
   onFingerprintsChanged_: function(fingerprintInfo) {
@@ -52,6 +52,7 @@
 
   /**
    * Deletes a fingerprint from |fingerprints_|.
+   * @param {!{model: !{index: !number}}} e
    * @private
    */
   onFingerprintDeleteTapped_: function(e) {
@@ -62,7 +63,10 @@
         }.bind(this));
   },
 
-  /** @private */
+  /**
+   * @param {!{model: !{index: !number, item: !string}}} e
+   * @private
+   */
   onFingerprintLabelChanged_: function(e) {
     this.browserProxy_.changeEnrollmentLabel(e.model.index, e.model.item);
   },
diff --git a/chrome/browser/resources/settings/people_page/lock_screen.html b/chrome/browser/resources/settings/people_page/lock_screen.html
index 9646103..e1e610a6 100644
--- a/chrome/browser/resources/settings/people_page/lock_screen.html
+++ b/chrome/browser/resources/settings/people_page/lock_screen.html
@@ -5,12 +5,12 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button-light.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-radio-group/paper-radio-group.html">
 <link rel="import" href="../controls/settings_toggle_button.html">
-<link rel="import" href="../i18n_setup.html">
-<link rel="import" href="fingerprint_list.html">
+<link rel="import" href="fingerprint_browser_proxy.html">
 <link rel="import" href="lock_screen_constants.html">
 <link rel="import" href="lock_state_behavior.html">
 <link rel="import" href="password_prompt_dialog.html">
 <link rel="import" href="setup_pin_dialog.html">
+<link rel="import" href="../i18n_setup.html">
 <link rel="import" href="../prefs/prefs_behavior.html">
 <link rel="import" href="../prefs/prefs.html">
 <link rel="import" href="../route.html">
@@ -42,6 +42,13 @@
         </div>
       </div>
 
+      <div class="settings-box">
+        <settings-toggle-button class="start"
+            pref="{{prefs.settings.enable_screen_lock}}"
+            label="$i18n{enableScreenlock}">
+        </settings-toggle-button>
+      </div>
+
       <template is="dom-if" if="[[fingerprintUnlockEnabled_]]">
         <div class="settings-box">
           <settings-toggle-button class="start"
@@ -56,7 +63,7 @@
             <div class="start">
               $i18n{lockScreenEditFingerprints}
               <div class="secondary" id="lockScreenEditFingerprintsSecondary">
-                $i18n{lockScreenEditFingerprintsDescription}
+                [[getDescriptionText_(numFingerprints_)]]
               </div>
             </div>
             <button class="subpage-arrow" is="paper-icon-button-light"
@@ -66,13 +73,6 @@
         </iron-collapse>
       </template>
 
-      <div class="settings-box">
-        <settings-toggle-button class="start"
-            pref="{{prefs.settings.enable_screen_lock}}"
-            label="$i18n{enableScreenlock}">
-        </settings-toggle-button>
-      </div>
-
       <settings-password-prompt-dialog id="passwordPrompt"
           on-close="onPasswordClosed_" set-modes="{{setModes_}}">
       </settings-password-prompt-dialog>
diff --git a/chrome/browser/resources/settings/people_page/lock_screen.js b/chrome/browser/resources/settings/people_page/lock_screen.js
index 0b21a2f4..a4eab35 100644
--- a/chrome/browser/resources/settings/people_page/lock_screen.js
+++ b/chrome/browser/resources/settings/people_page/lock_screen.js
@@ -73,8 +73,17 @@
       },
       readOnly: true,
     },
+
+    /** @private */
+    numFingerprints_: {
+      type: Number,
+      value: 0,
+    },
   },
 
+  /** @private {?settings.FingerprintBrowserProxy} */
+  browserProxy_: null,
+
   /** selectedUnlockType is defined in LockStateBehavior. */
   observers: ['selectedUnlockTypeChanged_(selectedUnlockType)'],
 
@@ -85,6 +94,7 @@
     // password prompt page.
     this.currentRouteChanged(settings.Route.LOCK_SCREEN,
         settings.Route.LOCK_SCREEN);
+    this.browserProxy_ = settings.FingerprintBrowserProxyImpl.getInstance();
   },
 
   /**
@@ -94,6 +104,15 @@
    * @protected
    */
   currentRouteChanged: function(newRoute, oldRoute) {
+    if (newRoute == settings.Route.LOCK_SCREEN &&
+        this.fingerprintUnlockEnabled_ &&
+        this.browserProxy_) {
+      this.browserProxy_.getNumFingerprints().then(
+          function(numFingerprints) {
+            this.numFingerprints_ = numFingerprints;
+          }.bind(this));
+    }
+
     if (newRoute == settings.Route.LOCK_SCREEN && !this.setModes_) {
       this.$.passwordPrompt.open();
     } else if (newRoute != settings.Route.FINGERPRINT &&
@@ -158,6 +177,14 @@
     return this.i18n('lockScreenSetupPinButton');
   },
 
+  /** @private */
+  getDescriptionText_: function() {
+    return this.numFingerprints_ > 0 ?
+        this.i18n('lockScreenNumberFingerprints',
+            this.numFingerprints_.toString()) :
+        this.i18n('lockScreenEditFingerprintsDescription');
+  },
+
   /**
    * @param {!Event} e
    * @private
diff --git a/chrome/browser/supervised_user/child_accounts/child_account_service_android.cc b/chrome/browser/supervised_user/child_accounts/child_account_service_android.cc
index 0cf6c7ac..016b82ac 100644
--- a/chrome/browser/supervised_user/child_accounts/child_account_service_android.cc
+++ b/chrome/browser/supervised_user/child_accounts/child_account_service_android.cc
@@ -4,12 +4,19 @@
 
 #include "chrome/browser/supervised_user/child_accounts/child_account_service_android.h"
 
+#include "base/android/callback_android.h"
+#include "base/bind.h"
+
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/supervised_user/child_accounts/child_account_service.h"
+#include "chrome/browser/supervised_user/child_accounts/child_account_service_factory.h"
 #include "jni/ChildAccountService_jni.h"
 
 using base::android::JavaParamRef;
+using base::android::JavaRef;
+using base::android::RunCallbackAndroid;
+using base::android::ScopedJavaGlobalRef;
 
 jboolean IsChildAccount(JNIEnv* env, const JavaParamRef<jclass>& jcaller) {
   ProfileManager* profile_manager = g_browser_process->profile_manager();
@@ -19,3 +26,17 @@
 bool RegisterChildAccountService(JNIEnv* env) {
   return RegisterNativesImpl(env);
 }
+
+void ListenForChildStatusReceived(JNIEnv* env,
+                                  const JavaParamRef<jclass>& jcaller,
+                                  const JavaParamRef<jobject>& callback) {
+  ProfileManager* profile_manager = g_browser_process->profile_manager();
+  ChildAccountService* service = ChildAccountServiceFactory::GetForProfile(
+      profile_manager->GetLastUsedProfile());
+  // Needed to disambiguate RunCallbackAndroid
+  void (*runCallback)(const JavaRef<jobject>&, bool) = &RunCallbackAndroid;
+  // TODO(https://crbug.com/692591) Should use base::BindOnce, but
+  // AddChildStatusReceivedCallback won't yet accept a BindOnce.
+  service->AddChildStatusReceivedCallback(
+      base::Bind(runCallback, ScopedJavaGlobalRef<jobject>(callback), true));
+}
diff --git a/chrome/browser/supervised_user/supervised_user_content_provider_android.cc b/chrome/browser/supervised_user/supervised_user_content_provider_android.cc
index e328d08..f98fea4 100644
--- a/chrome/browser/supervised_user/supervised_user_content_provider_android.cc
+++ b/chrome/browser/supervised_user/supervised_user_content_provider_android.cc
@@ -70,8 +70,12 @@
     const JavaParamRef<jobject>& query_result_jobj,
     const JavaParamRef<jstring>& url) {
   if (!profile_->IsSupervised()) {
-    // User isn't supervised
-    Java_SupervisedUserQueryReply_onQueryComplete(env, query_result_jobj);
+    // User isn't supervised, this can only happen if Chrome isn't signed in,
+    // in which case all requests should be rejected
+    Java_SupervisedUserQueryReply_onQueryFailed(
+        AttachCurrentThread(), query_result_jobj,
+        supervised_user_error_page::NOT_SIGNED_IN, false, true, nullptr,
+        nullptr, nullptr, nullptr, nullptr, nullptr);
     return;
   }
   SupervisedUserService* supervised_user_service =
diff --git a/chrome/browser/supervised_user/supervised_user_resource_throttle.cc b/chrome/browser/supervised_user/supervised_user_resource_throttle.cc
index 23ff78b..f674898 100644
--- a/chrome/browser/supervised_user/supervised_user_resource_throttle.cc
+++ b/chrome/browser/supervised_user/supervised_user_resource_throttle.cc
@@ -71,6 +71,9 @@
           return FILTERING_BEHAVIOR_BLOCK_MANUAL;
         case supervised_user_error_page::DEFAULT:
           return FILTERING_BEHAVIOR_BLOCK_DEFAULT;
+        case supervised_user_error_page::NOT_SIGNED_IN:
+          // Should never happen, only used for requests from Webview
+          NOTREACHED();
       }
     case SupervisedUserURLFilter::INVALID:
       NOTREACHED();
diff --git a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
index 2ab43137..5e8cbc2b 100644
--- a/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
+++ b/chrome/browser/ui/cocoa/toolbar/toolbar_controller.mm
@@ -4,8 +4,10 @@
 
 #import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
 
+#include <sys/stat.h>
 #include <algorithm>
 
+#include "base/debug/crash_logging.h"
 #include "base/mac/bundle_locations.h"
 #include "base/mac/foundation_util.h"
 #include "base/mac/mac_util.h"
@@ -52,6 +54,7 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/toolbar/app_menu_icon_controller.h"
 #include "chrome/browser/ui/toolbar/app_menu_model.h"
+#include "chrome/common/crash_keys.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
@@ -252,6 +255,25 @@
 }
 
 - (void)viewDidLoad {
+  // Temporary: collect information about a potentially missing or inaccessible
+  // nib (https://crbug.com/685985)
+  NSString* nibPath = [self.nibBundle pathForResource:@"Toolbar" ofType:@"nib"];
+  struct stat sb;
+  int nibErrno = 0;
+  if (stat(nibPath.fileSystemRepresentation, &sb) != 0) {
+    nibErrno = errno;
+  }
+  NSString* closestPath = nibPath;
+  while (closestPath && stat(closestPath.fileSystemRepresentation, &sb) != 0) {
+    closestPath = [closestPath stringByDeletingLastPathComponent];
+  }
+  base::debug::ScopedCrashKey nibCrashKey {
+    crash_keys::mac::kToolbarNibInfo,
+        [NSString stringWithFormat:@"errno: %d nib: %@ closest: %@", nibErrno,
+                                   nibPath, closestPath]
+            .UTF8String
+  };
+
   // When linking and running on 10.10+, both -awakeFromNib and -viewDidLoad may
   // be called, don't initialize twice.
   if (locationBarView_) {
diff --git a/chrome/browser/ui/webui/options/browser_options_handler.cc b/chrome/browser/ui/webui/options/browser_options_handler.cc
index 9143cf1..1088902 100644
--- a/chrome/browser/ui/webui/options/browser_options_handler.cc
+++ b/chrome/browser/ui/webui/options/browser_options_handler.cc
@@ -550,14 +550,14 @@
     { "configurePinWeakPin", IDS_SETTINGS_PEOPLE_CONFIGURE_PIN_WEAK_PIN },
     { "lockScreenAddFingerprint",
       IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ADD_FINGERPRINT_BUTTON},
-    { "lockScreenCannotAddFingerprint",
-      IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CANNOT_ADD_NEW_FINGERPRINT},
     { "lockScreenChangePinButton",
       IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CHANGE_PIN_BUTTON},
     { "lockScreenEditFingerprints",
       IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS},
     { "lockScreenEditFingerprintsDescription",
       IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS_DESCRIPTION},
+    {"lockScreenNumberFingerprints",
+      IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NUM_FINGERPRINTS},
     { "lockScreenFingerprintEnable",
       IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ENABLE_FINGERPRINT_CHECKBOX_LABEL},
     { "lockScreenFingerprintNewName",
diff --git a/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc b/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc
index afcf33a..a9079fa 100644
--- a/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.cc
@@ -51,6 +51,10 @@
       base::Bind(&FingerprintHandler::HandleGetFingerprintsList,
                  base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
+      "getNumFingerprints",
+      base::Bind(&FingerprintHandler::HandleGetNumFingerprints,
+                 base::Unretained(this)));
+  web_ui()->RegisterMessageCallback(
       "startEnroll",
       base::Bind(&FingerprintHandler::HandleStartEnroll,
                  base::Unretained(this)));
@@ -101,6 +105,18 @@
   ResolveJavascriptCallback(base::StringValue(callback_id), *fingerprint_info);
 }
 
+void FingerprintHandler::HandleGetNumFingerprints(const base::ListValue* args) {
+  AllowJavascript();
+
+  CHECK_EQ(1U, args->GetSize());
+  std::string callback_id;
+  CHECK(args->GetString(0, &callback_id));
+
+  ResolveJavascriptCallback(base::StringValue(callback_id),
+                            base::FundamentalValue(
+                                int{fingerprints_list_.size()}));
+}
+
 void FingerprintHandler::HandleStartEnroll(const base::ListValue* args) {
 }
 
diff --git a/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h b/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h
index 35cd8bf1..bf8f43d 100644
--- a/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h
@@ -28,6 +28,7 @@
 
  private:
   void HandleGetFingerprintsList(const base::ListValue* args);
+  void HandleGetNumFingerprints(const base::ListValue* args);
   void HandleStartEnroll(const base::ListValue* args);
   void HandleCancelCurrentEnroll(const base::ListValue* args);
   void HandleGetEnrollmentLabel(const base::ListValue* args);
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index e6ddd10..c4498fe8 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -1144,14 +1144,14 @@
     {"enableScreenlock", IDS_SETTINGS_PEOPLE_ENABLE_SCREENLOCK},
     {"lockScreenAddFingerprint",
      IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ADD_FINGERPRINT_BUTTON},
-    {"lockScreenCannotAddFingerprint",
-     IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CANNOT_ADD_NEW_FINGERPRINT},
     {"lockScreenChangePinButton",
      IDS_SETTINGS_PEOPLE_LOCK_SCREEN_CHANGE_PIN_BUTTON},
     {"lockScreenEditFingerprints",
      IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS},
     {"lockScreenEditFingerprintsDescription",
      IDS_SETTINGS_PEOPLE_LOCK_SCREEN_EDIT_FINGERPRINTS_DESCRIPTION},
+    {"lockScreenNumberFingerprints",
+     IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NUM_FINGERPRINTS},
     {"lockScreenNone", IDS_SETTINGS_PEOPLE_LOCK_SCREEN_NONE},
     {"lockScreenFingerprintEnable",
      IDS_SETTINGS_PEOPLE_LOCK_SCREEN_ENABLE_FINGERPRINT_CHECKBOX_LABEL},
diff --git a/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc b/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
index a62967e..6018d646 100644
--- a/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
+++ b/chrome/browser/ui/webui/supervised_user_internals_message_handler.cc
@@ -105,6 +105,9 @@
       return "Manual";
     case supervised_user_error_page::WHITELIST:
       return "Whitelist";
+    case supervised_user_error_page::NOT_SIGNED_IN:
+      // Should never happen, only used for requests from WebView
+      NOTREACHED();
   }
   return "Unknown/invalid";
 }
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 174c574f..eb72147 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -11,6 +11,12 @@
 
 // All features in alphabetical order.
 
+#if defined(OS_ANDROID)
+const base::Feature kAllowAutoplayUnmutedInWebappManifestScope{
+    "AllowAutoplayUnmutedInWebappManifestScope",
+    base::FEATURE_ENABLED_BY_DEFAULT};
+#endif  // defined(OS_ANDROID)
+
 #if defined(OS_MACOSX)
 // Enables Javascript execution via AppleScript.
 const base::Feature kAppleScriptExecuteJavaScript{
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 8ba7f41..c632e65 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -18,6 +18,10 @@
 // All features in alphabetical order. The features should be documented
 // alongside the definition of their values in the .cc file.
 
+#if defined(OS_ANDROID)
+extern const base::Feature kAllowAutoplayUnmutedInWebappManifestScope;
+#endif  // defined(OS_ANDROID)
+
 #if defined(OS_MACOSX)
 extern const base::Feature kAppleScriptExecuteJavaScript;
 #endif  // defined(OS_MACOSX)
diff --git a/chrome/common/crash_keys.cc b/chrome/common/crash_keys.cc
index 4ce7af6..e57c9a8 100644
--- a/chrome/common/crash_keys.cc
+++ b/chrome/common/crash_keys.cc
@@ -89,6 +89,8 @@
 
 const char kNSEvent[] = "nsevent";
 
+const char kToolbarNibInfo[] = "toolbar-nib-info";
+
 }  // namespace mac
 #endif
 
@@ -162,6 +164,7 @@
     { mac::kNSExceptionTrace, kMediumSize },
     { mac::kSendAction, kMediumSize },
     { mac::kNSEvent, kMediumSize },
+    { mac::kToolbarNibInfo, kMediumSize },
     { mac::kZombie, kMediumSize },
     { mac::kZombieTrace, kMediumSize },
     // content/:
diff --git a/chrome/common/crash_keys.h b/chrome/common/crash_keys.h
index bf6bbdc..8f491f1 100644
--- a/chrome/common/crash_keys.h
+++ b/chrome/common/crash_keys.h
@@ -144,6 +144,10 @@
 // In the CrApplication, records information about the current event.
 extern const char kNSEvent[];
 
+// TEMPORARY: Information about Toolbar.nib, stored right after it's supposed
+// to have loaded.  https://crbug.com/685985
+extern const char kToolbarNibInfo[];
+
 }  // namespace mac
 #endif
 
diff --git a/chrome/test/data/webui/settings/fingerprint_browsertest_chromeos.js b/chrome/test/data/webui/settings/fingerprint_browsertest_chromeos.js
index 32e3a4c..8a945e2 100644
--- a/chrome/test/data/webui/settings/fingerprint_browsertest_chromeos.js
+++ b/chrome/test/data/webui/settings/fingerprint_browsertest_chromeos.js
@@ -10,6 +10,7 @@
 var TestFingerprintBrowserProxy = function() {
   settings.TestBrowserProxy.call(this, [
     'getFingerprintsList',
+    'getNumFingerprints',
     'startEnroll',
     'cancelCurrentEnroll',
     'getEnrollmentLabel',
@@ -52,6 +53,12 @@
   },
 
   /** @override */
+  getNumFingerprints: function() {
+    this.methodCalled('getNumFingerprints');
+    return Promise.resolve(fingerprintsList_.length);
+  },
+
+  /** @override */
   startEnroll: function () {
     this.methodCalled('startEnroll');
   },
@@ -87,7 +94,6 @@
 
   /** @type {?SettingsSetupFingerprintDialogElement} */
   var dialog = null;
-
   /** @type {?settings.TestFingerprintBrowserProxy} */
   var browserProxy = null;
 
@@ -147,10 +153,10 @@
       // and the fingerprint list should have one fingerprint registered.
       assertFalse(dialog.$$('.action-button').disabled);
       MockInteractions.tap(dialog.$$('.action-button'));
-
-      return browserProxy.whenCalled('getFingerprintsList');
-    }).then(function() {
-      assertEquals(1, fingerprintList.fingerprints_.length);
+      return browserProxy.whenCalled('getFingerprintsList').then(
+          function() {
+            assertEquals(1, fingerprintList.fingerprints_.length);
+          });
     });
   });
 
diff --git a/chromecast/media/base/supported_codec_profile_levels_memo.cc b/chromecast/media/base/supported_codec_profile_levels_memo.cc
index be1e9a7..a851a15 100644
--- a/chromecast/media/base/supported_codec_profile_levels_memo.cc
+++ b/chromecast/media/base/supported_codec_profile_levels_memo.cc
@@ -34,7 +34,7 @@
   for (const auto& supported_profile_info : codec_profile_levels_) {
     if (codec == supported_profile_info.codec &&
         profile == supported_profile_info.profile &&
-        level == supported_profile_info.level) {
+        level <= supported_profile_info.level) {
       return true;
     }
   }
diff --git a/chromeos/dbus/services/cros_dbus_service.cc b/chromeos/dbus/services/cros_dbus_service.cc
index 07cfc38..ee37705 100644
--- a/chromeos/dbus/services/cros_dbus_service.cc
+++ b/chromeos/dbus/services/cros_dbus_service.cc
@@ -8,66 +8,60 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/sys_info.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "dbus/bus.h"
 #include "dbus/exported_object.h"
 #include "dbus/object_path.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
 
 namespace chromeos {
 
-namespace {
-
-CrosDBusService* g_cros_dbus_service = NULL;
-
-}  // namespace
-
 // The CrosDBusService implementation used in production, and unit tests.
 class CrosDBusServiceImpl : public CrosDBusService {
  public:
-  CrosDBusServiceImpl(dbus::Bus* bus, ServiceProviderList service_providers)
+  CrosDBusServiceImpl(dbus::Bus* bus,
+                      const std::string& service_name,
+                      const dbus::ObjectPath& object_path,
+                      ServiceProviderList service_providers)
       : service_started_(false),
         origin_thread_id_(base::PlatformThread::CurrentId()),
         bus_(bus),
-        service_providers_(std::move(service_providers)) {}
-
-  ~CrosDBusServiceImpl() override {
+        service_name_(service_name),
+        object_path_(object_path),
+        service_providers_(std::move(service_providers)) {
+    DCHECK(bus);
+    DCHECK(!service_name_.empty());
+    DCHECK(object_path_.IsValid());
   }
 
+  ~CrosDBusServiceImpl() override = default;
+
   // Starts the D-Bus service.
   void Start() {
     // Make sure we're running on the origin thread (i.e. the UI thread in
     // production).
     DCHECK(OnOriginThread());
-
-    // Return if the service has been already started.
-    if (service_started_)
-      return;
+    DCHECK(!service_started_);
 
     // There are some situations, described in http://crbug.com/234382#c27,
     // where processes on Linux can wind up stuck in an uninterruptible state
-    // for tens of seconds. If this happens when Chrome is trying to exit,
-    // this unkillable process can wind up clinging to ownership of
-    // kLibCrosServiceName while the system is trying to restart the browser.
-    // This leads to a fatal situation if we don't allow the new browser
-    // instance to replace the old as the owner of kLibCrosServiceName as seen
-    // in http://crbug.com/234382. Hence, REQUIRE_PRIMARY_ALLOW_REPLACEMENT.
-    bus_->RequestOwnership(kLibCrosServiceName,
-                           dbus::Bus::REQUIRE_PRIMARY_ALLOW_REPLACEMENT,
-                           base::Bind(&CrosDBusServiceImpl::OnOwnership,
-                                      base::Unretained(this)));
+    // for tens of seconds. If this happens when Chrome is trying to exit, this
+    // unkillable process can wind up clinging to ownership of |service_name_|
+    // while the system is trying to restart the browser. This leads to a fatal
+    // situation if we don't allow the new browser instance to replace the old
+    // as the owner of |service_name_| as seen in http://crbug.com/234382.
+    // Hence, REQUIRE_PRIMARY_ALLOW_REPLACEMENT.
+    bus_->RequestOwnership(
+        service_name_, dbus::Bus::REQUIRE_PRIMARY_ALLOW_REPLACEMENT,
+        base::Bind(&CrosDBusServiceImpl::OnOwnership, base::Unretained(this)));
 
-    exported_object_ = bus_->GetExportedObject(
-        dbus::ObjectPath(kLibCrosServicePath));
-
+    exported_object_ = bus_->GetExportedObject(object_path_);
     for (size_t i = 0; i < service_providers_.size(); ++i)
       service_providers_[i]->Start(exported_object_);
 
     service_started_ = true;
-
-    VLOG(1) << "CrosDBusServiceImpl started.";
   }
 
  private:
@@ -85,64 +79,56 @@
   bool service_started_;
   base::PlatformThreadId origin_thread_id_;
   dbus::Bus* bus_;
+  std::string service_name_;
+  dbus::ObjectPath object_path_;
   scoped_refptr<dbus::ExportedObject> exported_object_;
 
   // Service providers that form CrosDBusService.
   ServiceProviderList service_providers_;
+
+  DISALLOW_COPY_AND_ASSIGN(CrosDBusServiceImpl);
 };
 
 // The stub CrosDBusService implementation used on Linux desktop,
 // which does nothing as of now.
 class CrosDBusServiceStubImpl : public CrosDBusService {
  public:
-  CrosDBusServiceStubImpl() {
-  }
+  CrosDBusServiceStubImpl() = default;
+  ~CrosDBusServiceStubImpl() override = default;
 
-  ~CrosDBusServiceStubImpl() override {}
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CrosDBusServiceStubImpl);
 };
 
 // static
-void CrosDBusService::Initialize(ServiceProviderList service_providers) {
-  if (g_cros_dbus_service) {
-    LOG(WARNING) << "CrosDBusService was already initialized";
-    return;
-  }
-  dbus::Bus* bus = DBusThreadManager::Get()->GetSystemBus();
-  if (base::SysInfo::IsRunningOnChromeOS() && bus) {
-    auto* service = new CrosDBusServiceImpl(bus, std::move(service_providers));
-    g_cros_dbus_service = service;
-    service->Start();
-  } else {
-    g_cros_dbus_service = new CrosDBusServiceStubImpl;
-  }
-  VLOG(1) << "CrosDBusService initialized";
-}
-
-// static
-void CrosDBusService::InitializeForTesting(
-    dbus::Bus* bus,
+std::unique_ptr<CrosDBusService> CrosDBusService::Create(
+    const std::string& service_name,
+    const dbus::ObjectPath& object_path,
     ServiceProviderList service_providers) {
-  if (g_cros_dbus_service) {
-    LOG(WARNING) << "CrosDBusService was already initialized";
-    return;
-  }
-  auto* service = new CrosDBusServiceImpl(bus, std::move(service_providers));
-  service->Start();
-  g_cros_dbus_service = service;
-  VLOG(1) << "CrosDBusService initialized";
+  if (DBusThreadManager::Get()->IsUsingFakes())
+    return base::MakeUnique<CrosDBusServiceStubImpl>();
+
+  return CreateRealImpl(DBusThreadManager::Get()->GetSystemBus(), service_name,
+                        object_path, std::move(service_providers));
 }
 
 // static
-void CrosDBusService::Shutdown() {
-  delete g_cros_dbus_service;
-  g_cros_dbus_service = NULL;
-  VLOG(1) << "CrosDBusService Shutdown completed";
+std::unique_ptr<CrosDBusService> CrosDBusService::CreateRealImpl(
+    dbus::Bus* bus,
+    const std::string& service_name,
+    const dbus::ObjectPath& object_path,
+    ServiceProviderList service_providers) {
+  auto service = base::MakeUnique<CrosDBusServiceImpl>(
+      bus, service_name, object_path, std::move(service_providers));
+  service->Start();
+  return std::move(service);
 }
 
-CrosDBusService::~CrosDBusService() {
-}
+CrosDBusService::~CrosDBusService() = default;
 
-CrosDBusService::ServiceProviderInterface::~ServiceProviderInterface() {
-}
+CrosDBusService::CrosDBusService() = default;
+
+CrosDBusService::ServiceProviderInterface::~ServiceProviderInterface() =
+    default;
 
 }  // namespace chromeos
diff --git a/chromeos/dbus/services/cros_dbus_service.h b/chromeos/dbus/services/cros_dbus_service.h
index 26ab8c2..700f0998 100644
--- a/chromeos/dbus/services/cros_dbus_service.h
+++ b/chromeos/dbus/services/cros_dbus_service.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <vector>
 
+#include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/threading/platform_thread.h"
 #include "chromeos/chromeos_export.h"
@@ -15,22 +16,14 @@
 namespace dbus {
 class Bus;
 class ExportedObject;
+class ObjectPath;
 }
 
 namespace chromeos {
 
-// CrosDBusService is used to run a D-Bus service inside Chrome for Chrome
-// OS. The service will be registered as follows:
-//
-// Service name: org.chromium.LibCrosService (kLibCrosServiceName)
-// Object path: chromium/LibCrosService (kLibCrosServicePath)
-//
-// For historical reasons, the rather irrelevant name "LibCrosService" is
-// used in the D-Bus constants such as the service name.
-//
-// CrosDBusService exports D-Bus methods through service provider classes
-// that implement CrosDBusService::ServiceProviderInterface.
-
+// CrosDBusService is used to run a D-Bus service inside Chrome for Chrome OS.
+// It exports D-Bus methods through service provider classes that implement
+// CrosDBusService::ServiceProviderInterface.
 class CHROMEOS_EXPORT CrosDBusService {
  public:
   // CrosDBusService consists of service providers that implement this
@@ -48,20 +41,32 @@
   using ServiceProviderList =
       std::vector<std::unique_ptr<ServiceProviderInterface>>;
 
-  // Initializes the global instance.
-  static void Initialize(ServiceProviderList service_providers);
-  // Destroys the global instance.
-  static void Shutdown();
+  // Creates, starts, and returns a new instance owning |service_name| and
+  // exporting |service_providers|'s methods on |object_path|. Static so a stub
+  // implementation can be used when not running on a device.
+  static std::unique_ptr<CrosDBusService> Create(
+      const std::string& service_name,
+      const dbus::ObjectPath& object_path,
+      ServiceProviderList service_providers);
+
+  virtual ~CrosDBusService();
 
  protected:
-  virtual ~CrosDBusService();
+  CrosDBusService();
 
  private:
   friend class CrosDBusServiceTest;
 
-  // Initializes the global instance for testing.
-  static void InitializeForTesting(dbus::Bus* bus,
-                                   ServiceProviderList service_providers);
+  // Creates, starts, and returns a real implementation of CrosDBusService that
+  // uses |bus|. Called by Create(), but can also be called directly by tests
+  // that need a non-stub implementation even when not running on a device.
+  static std::unique_ptr<CrosDBusService> CreateRealImpl(
+      dbus::Bus* bus,
+      const std::string& service_name,
+      const dbus::ObjectPath& object_path,
+      ServiceProviderList service_providers);
+
+  DISALLOW_COPY_AND_ASSIGN(CrosDBusService);
 };
 
 }  // namespace chromeos
diff --git a/chromeos/dbus/services/cros_dbus_service_unittest.cc b/chromeos/dbus/services/cros_dbus_service_unittest.cc
index a2baabc0..bd0470c 100644
--- a/chromeos/dbus/services/cros_dbus_service_unittest.cc
+++ b/chromeos/dbus/services/cros_dbus_service_unittest.cc
@@ -4,6 +4,7 @@
 
 #include "chromeos/dbus/services/cros_dbus_service.h"
 
+#include <memory>
 #include <utility>
 
 #include "base/bind.h"
@@ -19,6 +20,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
+using ::testing::_;
 using ::testing::Eq;
 using ::testing::Invoke;
 using ::testing::Return;
@@ -34,8 +36,7 @@
 
 class CrosDBusServiceTest : public testing::Test {
  public:
-  CrosDBusServiceTest() {
-  }
+  CrosDBusServiceTest() = default;
 
   // Creates an instance of CrosDBusService with mocks injected.
   void SetUp() override {
@@ -47,16 +48,22 @@
     // ShutdownAndBlock() will be called in TearDown().
     EXPECT_CALL(*mock_bus_.get(), ShutdownAndBlock()).WillOnce(Return());
 
-    // Create a mock exported object that behaves as
-    // org.chromium.CrosDBusService.
+    // CrosDBusService should take ownership of the service name passed to it.
+    const char kServiceName[] = "org.example.TestService";
+    EXPECT_CALL(
+        *mock_bus_.get(),
+        RequestOwnership(kServiceName,
+                         dbus::Bus::REQUIRE_PRIMARY_ALLOW_REPLACEMENT, _))
+        .Times(1);
+
+    // Create a mock exported object.
+    const dbus::ObjectPath kObjectPath("/org/example/TestService");
     mock_exported_object_ =
-        new dbus::MockExportedObject(mock_bus_.get(),
-                                     dbus::ObjectPath(kLibCrosServicePath));
+        new dbus::MockExportedObject(mock_bus_.get(), kObjectPath);
 
     // |mock_bus_|'s GetExportedObject() will return mock_exported_object_|
     // for the given service name and the object path.
-    EXPECT_CALL(*mock_bus_.get(),
-                GetExportedObject(dbus::ObjectPath(kLibCrosServicePath)))
+    EXPECT_CALL(*mock_bus_.get(), GetExportedObject(kObjectPath))
         .WillOnce(Return(mock_exported_object_.get()));
 
     // Create a mock proxy resolution service.
@@ -66,25 +73,25 @@
     // Start() will be called with |mock_exported_object_|.
     EXPECT_CALL(*mock_proxy_resolution_service_provider,
                 Start(Eq(mock_exported_object_))).WillOnce(Return());
+
     // Initialize the cros service with the mocks injected.
     CrosDBusService::ServiceProviderList service_providers;
     service_providers.push_back(
         std::move(mock_proxy_resolution_service_provider));
-    CrosDBusService::InitializeForTesting(mock_bus_.get(),
-                                          std::move(service_providers));
+    cros_dbus_service_ = CrosDBusService::CreateRealImpl(
+        mock_bus_.get(), kServiceName, kObjectPath,
+        std::move(service_providers));
   }
 
   void TearDown() override {
-    // Shutdown the cros service.
-    CrosDBusService::Shutdown();
-
-    // Shutdown the bus.
+    cros_dbus_service_.reset();
     mock_bus_->ShutdownAndBlock();
   }
 
  protected:
   scoped_refptr<dbus::MockBus> mock_bus_;
   scoped_refptr<dbus::MockExportedObject> mock_exported_object_;
+  std::unique_ptr<CrosDBusService> cros_dbus_service_;
 };
 
 TEST_F(CrosDBusServiceTest, Start) {
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc
index f67a3777..25715dc0 100644
--- a/chromeos/settings/cros_settings_names.cc
+++ b/chromeos/settings/cros_settings_names.cc
@@ -32,6 +32,8 @@
     "arc_kiosk_class";
 const char kAccountsPrefDeviceLocalAccountsKeyArcKioskAction[] =
     "arc_kiosk_action";
+const char kAccountsPrefDeviceLocalAccountsKeyArcKioskDisplayName[] =
+    "arc_kiosk_display_name";
 const char kAccountsPrefDeviceLocalAccountAutoLoginId[] =
     "cros.accounts.deviceLocalAccountAutoLoginId";
 const char kAccountsPrefDeviceLocalAccountAutoLoginDelay[] =
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h
index 7c9c289..eba479e1 100644
--- a/chromeos/settings/cros_settings_names.h
+++ b/chromeos/settings/cros_settings_names.h
@@ -29,6 +29,8 @@
     kAccountsPrefDeviceLocalAccountsKeyArcKioskClass[];
 CHROMEOS_EXPORT extern const char
     kAccountsPrefDeviceLocalAccountsKeyArcKioskAction[];
+CHROMEOS_EXPORT extern const char
+    kAccountsPrefDeviceLocalAccountsKeyArcKioskDisplayName[];
 CHROMEOS_EXPORT extern const char kAccountsPrefDeviceLocalAccountAutoLoginId[];
 CHROMEOS_EXPORT extern const char
     kAccountsPrefDeviceLocalAccountAutoLoginDelay[];
diff --git a/components/BUILD.gn b/components/BUILD.gn
index a197558e..9dfe6ff5 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -81,6 +81,7 @@
     "//components/data_usage/core:unit_tests",
     "//components/device_event_log:unit_tests",
     "//components/dom_distiller/core:unit_tests",
+    "//components/doodle:unit_tests",
     "//components/favicon/core:unit_tests",
     "//components/favicon_base:unit_tests",
     "//components/flags_ui:unit_tests",
diff --git a/components/doodle/BUILD.gn b/components/doodle/BUILD.gn
new file mode 100644
index 0000000..d16538e3
--- /dev/null
+++ b/components/doodle/BUILD.gn
@@ -0,0 +1,30 @@
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+static_library("doodle") {
+  sources = [
+    "doodle_fetcher.cc",
+    "doodle_fetcher.h",
+  ]
+
+  deps = [
+    "//base",
+    "//components/google/core/browser",
+    "//net",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [
+    "doodle_fetcher_unittest.cc",
+  ]
+
+  deps = [
+    ":doodle",
+    "//components/google/core/browser",
+    "//net:test_support",
+    "//ui/base",
+  ]
+}
diff --git a/components/doodle/DEPS b/components/doodle/DEPS
new file mode 100644
index 0000000..e20a0d4b
--- /dev/null
+++ b/components/doodle/DEPS
@@ -0,0 +1,6 @@
+include_rules = [
+  "+components/google/core/browser",
+  "+net/base",
+  "+net/http/http_status_code.h",
+  "+net/url_request",
+]
diff --git a/components/doodle/OWNERS b/components/doodle/OWNERS
new file mode 100644
index 0000000..009f486
--- /dev/null
+++ b/components/doodle/OWNERS
@@ -0,0 +1 @@
+treib@chromium.org
diff --git a/components/doodle/doodle_fetcher.cc b/components/doodle/doodle_fetcher.cc
new file mode 100644
index 0000000..e85ec48
--- /dev/null
+++ b/components/doodle/doodle_fetcher.cc
@@ -0,0 +1,240 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/doodle/doodle_fetcher.h"
+
+#include <utility>
+
+#include "base/strings/string_number_conversions.h"
+#include "base/time/clock.h"
+#include "base/time/default_clock.h"
+#include "base/time/time.h"
+#include "base/values.h"
+#include "components/google/core/browser/google_url_tracker.h"
+#include "components/google/core/browser/google_util.h"
+#include "net/base/load_flags.h"
+#include "net/http/http_status_code.h"
+#include "net/url_request/url_fetcher.h"
+
+using net::URLFetcher;
+
+namespace doodle {
+
+namespace {
+
+const double kMaxTimeToLiveMS = 30.0 * 24 * 60 * 60 * 1000;  // 30 days
+
+const char kDoodleConfigPath[] = "/async/ddljson";
+
+std::string StripSafetyPreamble(const std::string& json) {
+  // The response may start with )]}'. Ignore this.
+  const char kResponsePreamble[] = ")]}'";
+
+  base::StringPiece json_sp(json);
+  if (json_sp.starts_with(kResponsePreamble)) {
+    json_sp.remove_prefix(strlen(kResponsePreamble));
+  }
+
+  return json_sp.as_string();
+}
+
+DoodleType ParseDoodleType(const base::DictionaryValue& ddljson) {
+  std::string type_str;
+  ddljson.GetString("doodle_type", &type_str);
+  if (type_str == "SIMPLE") {
+    return DoodleType::SIMPLE;
+  }
+  if (type_str == "RANDOM") {
+    return DoodleType::RANDOM;
+  }
+  if (type_str == "VIDEO") {
+    return DoodleType::VIDEO;
+  }
+  if (type_str == "INTERACTIVE") {
+    return DoodleType::INTERACTIVE;
+  }
+  if (type_str == "INLINE_INTERACTIVE") {
+    return DoodleType::INLINE_INTERACTIVE;
+  }
+  if (type_str == "SLIDESHOW") {
+    return DoodleType::SLIDESHOW;
+  }
+  return DoodleType::UNKNOWN;
+}
+
+}  // namespace
+
+DoodleImage::DoodleImage()
+    : height(0), width(0), is_animated_gif(false), is_cta(false) {}
+DoodleImage::~DoodleImage() = default;
+
+DoodleConfig::DoodleConfig() : doodle_type(DoodleType::UNKNOWN) {}
+DoodleConfig::DoodleConfig(const DoodleConfig& config) = default;
+DoodleConfig::~DoodleConfig() = default;
+
+DoodleFetcher::DoodleFetcher(
+    scoped_refptr<net::URLRequestContextGetter> download_context,
+    GoogleURLTracker* google_url_tracker,
+    const ParseJSONCallback& json_parsing_callback)
+    : download_context_(download_context),
+      json_parsing_callback_(json_parsing_callback),
+      google_url_tracker_(google_url_tracker),
+      clock_(new base::DefaultClock()),
+      weak_ptr_factory_(this) {
+  DCHECK(google_url_tracker_);
+}
+
+DoodleFetcher::~DoodleFetcher() = default;
+
+void DoodleFetcher::FetchDoodle(FinishedCallback callback) {
+  if (IsFetchInProgress()) {
+    callbacks_.push_back(std::move(callback));
+    return;  // The callback will be called for the existing request's results.
+  }
+  DCHECK(!fetcher_.get());
+  callbacks_.push_back(std::move(callback));
+  fetcher_ = URLFetcher::Create(GetGoogleBaseUrl().Resolve(kDoodleConfigPath),
+                                URLFetcher::GET, this);
+  fetcher_->SetRequestContext(download_context_.get());
+  fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES |
+                         net::LOAD_DO_NOT_SAVE_COOKIES |
+                         net::LOAD_DO_NOT_SEND_AUTH_DATA);
+  fetcher_->SetAutomaticallyRetryOnNetworkChanges(1);
+  fetcher_->Start();
+}
+
+void DoodleFetcher::OnURLFetchComplete(const URLFetcher* source) {
+  DCHECK_EQ(fetcher_.get(), source);
+  std::unique_ptr<net::URLFetcher> free_fetcher = std::move(fetcher_);
+
+  std::string json_string;
+  if (!(source->GetStatus().is_success() &&
+        source->GetResponseCode() == net::HTTP_OK &&
+        source->GetResponseAsString(&json_string))) {
+    RespondToAllCallbacks(DoodleState::DOWNLOAD_ERROR, base::nullopt);
+    return;
+  }
+
+  json_parsing_callback_.Run(
+      StripSafetyPreamble(std::move(json_string)),
+      base::Bind(&DoodleFetcher::OnJsonParsed, weak_ptr_factory_.GetWeakPtr()),
+      base::Bind(&DoodleFetcher::OnJsonParseFailed,
+                 weak_ptr_factory_.GetWeakPtr()));
+}
+
+void DoodleFetcher::OnJsonParsed(std::unique_ptr<base::Value> json) {
+  std::unique_ptr<base::DictionaryValue> config =
+      base::DictionaryValue::From(std::move(json));
+  if (!config.get()) {
+    DLOG(WARNING) << "Doodle JSON is not valid";
+    RespondToAllCallbacks(DoodleState::PARSING_ERROR, base::nullopt);
+    return;
+  }
+
+  const base::DictionaryValue* ddljson = nullptr;
+  if (!config->GetDictionary("ddljson", &ddljson)) {
+    DLOG(WARNING) << "Doodle JSON reponse did not contain 'ddljson' key.";
+    RespondToAllCallbacks(DoodleState::PARSING_ERROR, base::nullopt);
+    return;
+  }
+
+  base::Optional<DoodleConfig> doodle = ParseDoodle(*ddljson);
+  if (!doodle.has_value()) {
+    RespondToAllCallbacks(DoodleState::NO_DOODLE, base::nullopt);
+    return;
+  }
+
+  RespondToAllCallbacks(DoodleState::AVAILABLE, std::move(doodle));
+}
+
+void DoodleFetcher::OnJsonParseFailed(const std::string& error_message) {
+  DLOG(WARNING) << "JSON parsing failed: " << error_message;
+  RespondToAllCallbacks(DoodleState::PARSING_ERROR, base::nullopt);
+}
+
+base::Optional<DoodleConfig> DoodleFetcher::ParseDoodle(
+    const base::DictionaryValue& ddljson) const {
+  DoodleConfig doodle;
+  if (!ParseImage(ddljson, "large_image", &doodle.large_image)) {
+    return base::nullopt;
+  }
+  ParseImage(ddljson, "transparent_large_image",
+             &doodle.transparent_large_image);
+  ParseImage(ddljson, "large_cta_image", &doodle.large_cta_image);
+  ParseBaseInformation(ddljson, &doodle);
+  return doodle;
+}
+
+bool DoodleFetcher::ParseImage(const base::DictionaryValue& image_parent,
+                               const std::string& image_name,
+                               DoodleImage* image) const {
+  DCHECK(image);
+  const base::DictionaryValue* image_dict = nullptr;
+  if (!image_parent.GetDictionary(image_name, &image_dict)) {
+    return false;
+  }
+  image->url = ParseRelativeUrl(*image_dict, "url");
+  if (!image->url.is_valid()) {
+    DLOG(WARNING) << "Image URL for \"" << image_name << "\" is invalid.";
+    return false;
+  }
+  image_dict->GetInteger("height", &image->height);
+  image_dict->GetInteger("width", &image->width);
+  image_dict->GetBoolean("is_animated_gif", &image->is_animated_gif);
+  image_dict->GetBoolean("is_cta", &image->is_cta);
+  return true;
+}
+
+void DoodleFetcher::ParseBaseInformation(const base::DictionaryValue& ddljson,
+                                         DoodleConfig* config) const {
+  config->search_url = ParseRelativeUrl(ddljson, "search_url");
+  config->target_url = ParseRelativeUrl(ddljson, "target_url");
+  config->fullpage_interactive_url =
+      ParseRelativeUrl(ddljson, "fullpage_interactive_url");
+
+  config->doodle_type = ParseDoodleType(ddljson);
+  ddljson.GetString("alt_text", &config->alt_text);
+  ddljson.GetString("interactive_html", &config->interactive_html);
+
+  // The JSON doesn't guarantee the number to fit into an int.
+  double ttl = 0;  // Expires immediately if the parameter is missing.
+  if (!ddljson.GetDouble("time_to_live_ms", &ttl) || ttl < 0) {
+    DLOG(WARNING) << "No valid Doodle image TTL present in ddljson!";
+    ttl = 0;
+  }
+  if (ttl > kMaxTimeToLiveMS) {
+    ttl = kMaxTimeToLiveMS;
+    DLOG(WARNING) << "Clamping Doodle image TTL to 30 days!";
+  }
+  config->expiry_date = clock_->Now() + base::TimeDelta::FromMillisecondsD(ttl);
+}
+
+GURL DoodleFetcher::ParseRelativeUrl(const base::DictionaryValue& dict_value,
+                                     const std::string& key) const {
+  std::string str_url;
+  dict_value.GetString(key, &str_url);
+  if (str_url.empty()) {
+    return GURL();
+  }
+  return GetGoogleBaseUrl().Resolve(str_url);
+}
+
+void DoodleFetcher::RespondToAllCallbacks(
+    DoodleState state,
+    const base::Optional<DoodleConfig>& config) {
+  for (auto& callback : callbacks_) {
+    std::move(callback).Run(state, config);
+  }
+  callbacks_.clear();
+}
+
+GURL DoodleFetcher::GetGoogleBaseUrl() const {
+  GURL cmd_line_url = google_util::CommandLineGoogleBaseURL();
+  if (cmd_line_url.is_valid()) {
+    return cmd_line_url;
+  }
+  return google_url_tracker_->google_url();
+}
+
+}  // namespace doodle
diff --git a/components/doodle/doodle_fetcher.h b/components/doodle/doodle_fetcher.h
new file mode 100644
index 0000000..009dc55
--- /dev/null
+++ b/components/doodle/doodle_fetcher.h
@@ -0,0 +1,162 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_DOODLE_DOODLE_FETCHER_H_
+#define COMPONENTS_DOODLE_DOODLE_FETCHER_H_
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "net/url_request/url_fetcher_delegate.h"
+#include "net/url_request/url_request_context_getter.h"
+#include "url/gurl.h"
+
+class GoogleURLTracker;
+
+namespace base {
+class Clock;
+class DictionaryValue;
+class Value;
+}
+
+namespace doodle {
+
+enum class DoodleState {
+  AVAILABLE,
+  NO_DOODLE,
+  DOWNLOAD_ERROR,
+  PARSING_ERROR,
+};
+
+enum class DoodleType {
+  UNKNOWN,
+  SIMPLE,
+  RANDOM,
+  VIDEO,
+  INTERACTIVE,
+  INLINE_INTERACTIVE,
+  SLIDESHOW,
+};
+
+// Information about a Doodle image. If the image is invalid, the |url| will be
+// empty and invalid. By default the dimensions are 0.
+struct DoodleImage {
+  DoodleImage();
+  ~DoodleImage();
+
+  GURL url;
+  int height;
+  int width;
+  bool is_animated_gif;
+  bool is_cta;
+
+  // Copying and assignment allowed.
+};
+
+// All information about a current doodle that can be fetched from the remote
+// end. By default, all URLs are empty and therefore invalid.
+struct DoodleConfig {
+  DoodleConfig();
+  DoodleConfig(const DoodleConfig& config);  // = default;
+  ~DoodleConfig();
+
+  DoodleType doodle_type;
+  std::string alt_text;
+  std::string interactive_html;
+
+  base::Time expiry_date;
+  GURL search_url;
+  GURL target_url;
+  GURL fullpage_interactive_url;
+
+  DoodleImage large_image;
+  DoodleImage large_cta_image;
+  DoodleImage transparent_large_image;
+};
+
+// This class provides information about any recent doodle.
+// It works asynchronously and calls a callback when finished fetching the
+// information from the remote enpoint.
+class DoodleFetcher : public net::URLFetcherDelegate {
+ public:
+  // Callback that is invoked when the fetching is done.
+  // |doodle_config| will only contain a value if |state| is AVAILABLE.
+  using FinishedCallback = base::OnceCallback<void(
+      DoodleState state,
+      const base::Optional<DoodleConfig>& doodle_config)>;
+  // Callback for JSON parsing to allow injecting platform-dependent code.
+  using ParseJSONCallback = base::Callback<void(
+      const std::string& unsafe_json,
+      const base::Callback<void(std::unique_ptr<base::Value> json)>& success,
+      const base::Callback<void(const std::string&)>& error)>;
+
+  DoodleFetcher(scoped_refptr<net::URLRequestContextGetter> download_context,
+                GoogleURLTracker* google_url_tracker,
+                const ParseJSONCallback& json_parsing_callback);
+  ~DoodleFetcher() override;
+
+  // Fetches a doodle asynchronously. The |callback| is called with a
+  // DoodleState indicating whether the request succeded in fetching a doodle.
+  // If a fetch is already running, the callback will be queued and invoked with
+  // result from the next completed request.
+  void FetchDoodle(FinishedCallback callback);
+
+  // Overrides internal clock for testing purposes.
+  void SetClockForTesting(std::unique_ptr<base::Clock> clock) {
+    clock_ = std::move(clock);
+  }
+
+ private:
+  // net::URLFetcherDelegate implementation.
+  void OnURLFetchComplete(const net::URLFetcher* source) override;
+
+  // ParseJSONCallback Success callback
+  void OnJsonParsed(std::unique_ptr<base::Value> json);
+  // ParseJSONCallback Failure callback
+  void OnJsonParseFailed(const std::string& error_message);
+
+  base::Optional<DoodleConfig> ParseDoodle(
+      const base::DictionaryValue& ddljson) const;
+  bool ParseImage(const base::DictionaryValue& image_dict,
+                  const std::string& image_name,
+                  DoodleImage* image) const;
+  void ParseBaseInformation(const base::DictionaryValue& ddljson,
+                            DoodleConfig* config) const;
+  GURL ParseRelativeUrl(const base::DictionaryValue& dict_value,
+                        const std::string& key) const;
+
+  void RespondToAllCallbacks(DoodleState state,
+                             const base::Optional<DoodleConfig>& config);
+  GURL GetGoogleBaseUrl() const;
+
+  // Returns whether a fetch is still in progress. A fetch begins when a
+  // callback is added and ends when the last callback was called.
+  bool IsFetchInProgress() const { return !callbacks_.empty(); }
+
+  // Parameters set from constructor.
+  scoped_refptr<net::URLRequestContextGetter> const download_context_;
+  ParseJSONCallback json_parsing_callback_;
+  GoogleURLTracker* google_url_tracker_;
+
+  // Allow for an injectable tick clock for testing.
+  std::unique_ptr<base::Clock> clock_;
+
+  std::vector<FinishedCallback> callbacks_;
+  std::unique_ptr<net::URLFetcher> fetcher_;
+
+  base::WeakPtrFactory<DoodleFetcher> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(DoodleFetcher);
+};
+
+}  // namespace doodle
+
+#endif  // COMPONENTS_DOODLE_DOODLE_FETCHER_H_
diff --git a/components/doodle/doodle_fetcher_unittest.cc b/components/doodle/doodle_fetcher_unittest.cc
new file mode 100644
index 0000000..5486b4c
--- /dev/null
+++ b/components/doodle/doodle_fetcher_unittest.cc
@@ -0,0 +1,425 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/doodle/doodle_fetcher.h"
+
+#include <string>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/command_line.h"
+#include "base/json/json_reader.h"
+#include "base/memory/ptr_util.h"
+#include "base/message_loop/message_loop.h"
+#include "base/test/simple_test_clock.h"
+#include "base/values.h"
+#include "components/google/core/browser/google_switches.h"
+#include "components/google/core/browser/google_url_tracker.h"
+#include "net/http/http_status_code.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "net/url_request/url_request_status.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::Eq;
+
+namespace doodle {
+
+namespace {
+
+const char kDoodleConfigPath[] = "/async/ddljson";
+
+// Required to instantiate a GoogleUrlTracker in UNIT_TEST_MODE.
+class GoogleURLTrackerClientStub : public GoogleURLTrackerClient {
+ public:
+  GoogleURLTrackerClientStub() {}
+  ~GoogleURLTrackerClientStub() override {}
+
+  bool IsBackgroundNetworkingEnabled() override { return true; }
+
+  PrefService* GetPrefs() override { return nullptr; }
+
+  net::URLRequestContextGetter* GetRequestContext() override { return nullptr; }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(GoogleURLTrackerClientStub);
+};
+
+std::string Resolve(const std::string& relative_url) {
+  return GURL(GoogleURLTracker::kDefaultGoogleHomepage)
+      .Resolve(relative_url)
+      .spec();
+}
+
+void ParseJson(
+    const std::string& json,
+    const base::Callback<void(std::unique_ptr<base::Value> json)>& success,
+    const base::Callback<void(const std::string&)>& error) {
+  base::JSONReader json_reader;
+  std::unique_ptr<base::Value> value = json_reader.ReadToValue(json);
+  if (value) {
+    success.Run(std::move(value));
+  } else {
+    error.Run(json_reader.GetErrorMessage());
+  }
+}
+
+}  // namespace
+
+class DoodleFetcherTest : public testing::Test {
+ public:
+  DoodleFetcherTest()
+      : url_(GURL(GoogleURLTracker::kDefaultGoogleHomepage)),
+        google_url_tracker_(base::MakeUnique<GoogleURLTrackerClientStub>(),
+                            GoogleURLTracker::UNIT_TEST_MODE),
+        doodle_fetcher_(
+            new net::TestURLRequestContextGetter(message_loop_.task_runner()),
+            &google_url_tracker_,
+            base::Bind(ParseJson)) {
+    // Random difference to ensure that expiry_dates are really relative.
+    auto clock = base::MakeUnique<base::SimpleTestClock>();
+    clock_ = clock.get();
+    clock_->Advance(base::TimeDelta::FromMilliseconds(1123581321));
+    doodle_fetcher_.SetClockForTesting(std::move(clock));
+  }
+
+  void RespondWithData(const std::string& data) {
+    RespondToFetcherWithData(GetRunningFetcher(), data);
+  }
+
+  void RespondToFetcherWithData(net::TestURLFetcher* url_fetcher,
+                                const std::string& data) {
+    url_fetcher->set_status(net::URLRequestStatus());
+    url_fetcher->set_response_code(net::HTTP_OK);
+    url_fetcher->SetResponseString(data);
+    // Call the URLFetcher delegate to continue the test.
+    url_fetcher->delegate()->OnURLFetchComplete(url_fetcher);
+  }
+
+  void RespondWithError(int error_code) {
+    net::TestURLFetcher* url_fetcher = GetRunningFetcher();
+    url_fetcher->set_status(net::URLRequestStatus::FromError(error_code));
+    url_fetcher->SetResponseString("");
+    // Call the URLFetcher delegate to continue the test.
+    url_fetcher->delegate()->OnURLFetchComplete(url_fetcher);
+  }
+
+  net::TestURLFetcher* GetRunningFetcher() {
+    // All created TestURLFetchers have ID 0 by default.
+    net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0);
+    DCHECK(url_fetcher);
+    return url_fetcher;
+  }
+
+  DoodleFetcher::FinishedCallback CreateResponseSavingCallback(
+      DoodleState* state_out,
+      base::Optional<DoodleConfig>* config_out) {
+    return base::BindOnce(
+        [](DoodleState* state_out, base::Optional<DoodleConfig>* config_out,
+           DoodleState state, const base::Optional<DoodleConfig>& config) {
+          if (state_out) {
+            *state_out = state;
+          }
+          if (config_out) {
+            *config_out = config;
+          }
+        },
+        state_out, config_out);
+  }
+
+  DoodleFetcher* doodle_fetcher() { return &doodle_fetcher_; }
+
+  GURL GetGoogleBaseURL() { return google_url_tracker_.google_url(); }
+
+  base::Time TimeFromNow(uint64_t milliseconds) {
+    return clock_->Now() + base::TimeDelta::FromMilliseconds(milliseconds);
+  }
+
+ private:
+  base::MessageLoop message_loop_;
+  GURL url_;
+  net::TestURLFetcherFactory url_fetcher_factory_;
+  base::SimpleTestClock* clock_;  // Owned by the doodle_fetcher.
+  GoogleURLTracker google_url_tracker_;
+  DoodleFetcher doodle_fetcher_;
+};
+
+TEST_F(DoodleFetcherTest, ReturnsFromFetchWithoutError) {
+  DoodleState state(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData(R"json({"ddljson": {
+        "time_to_live_ms":55000,
+        "large_image": {"url":"/logos/doodles/2015/some.gif"}
+      }})json");
+
+  EXPECT_THAT(state, Eq(DoodleState::AVAILABLE));
+  EXPECT_TRUE(response.has_value());
+}
+
+TEST_F(DoodleFetcherTest, ReturnsFrom404FetchWithError) {
+  DoodleState state(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithError(net::ERR_FILE_NOT_FOUND);
+
+  EXPECT_THAT(state, Eq(DoodleState::DOWNLOAD_ERROR));
+  EXPECT_FALSE(response.has_value());
+}
+
+TEST_F(DoodleFetcherTest, ReturnsErrorForInvalidJson) {
+  DoodleState state(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData("}");
+
+  EXPECT_THAT(state, Eq(DoodleState::PARSING_ERROR));
+  EXPECT_FALSE(response.has_value());
+}
+
+TEST_F(DoodleFetcherTest, ReturnsErrorForIncompleteJson) {
+  DoodleState state(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData("{}");
+
+  EXPECT_THAT(state, Eq(DoodleState::PARSING_ERROR));
+  EXPECT_FALSE(response.has_value());
+}
+
+TEST_F(DoodleFetcherTest, ResponseContainsValidBaseInformation) {
+  DoodleState state(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData(R"json()]}'{
+      "ddljson": {
+        "alt_text":"Mouseover Text",
+        "doodle_type":"SIMPLE",
+        "interactive_html":"\u003cstyle\u003e\u003c\/style\u003e",
+        "search_url":"/search?q\u003dtest",
+        "target_url":"/search?q\u003dtest\u0026sa\u003dX\u0026ved\u003d0ahUKEw",
+        "time_to_live_ms":55000,
+        "large_image": {
+          "url":"/logos/doodles/2015/new-years-eve-2015-59854387958251-hp.gif"
+        }
+      }})json");
+
+  EXPECT_THAT(state, Eq(DoodleState::AVAILABLE));
+  ASSERT_TRUE(response.has_value());
+  DoodleConfig config = response.value();
+
+  EXPECT_TRUE(config.search_url.is_valid());
+  EXPECT_THAT(config.search_url, Eq(Resolve("/search?q\u003dtest")));
+  EXPECT_TRUE(config.fullpage_interactive_url.is_empty());
+  EXPECT_TRUE(config.target_url.is_valid());
+  EXPECT_THAT(config.target_url,
+              Eq(Resolve("/search?q\u003dtest\u0026sa\u003dX\u0026ved\u003d"
+                         "0ahUKEw")));
+  EXPECT_THAT(config.doodle_type, Eq(DoodleType::SIMPLE));
+  EXPECT_THAT(config.alt_text, Eq("Mouseover Text"));
+  EXPECT_THAT(config.interactive_html,
+              Eq("\u003cstyle\u003e\u003c/style\u003e"));
+
+  EXPECT_THAT(config.expiry_date, Eq(TimeFromNow(55000)));
+}
+
+TEST_F(DoodleFetcherTest, DoodleExpiresWithinThirtyDaysForTooLargeTTL) {
+  DoodleState state(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData(R"json({"ddljson": {
+      "time_to_live_ms":5184000000,
+      "large_image": {"url":"/logos/doodles/2015/some.gif"}
+    }})json");  // 60 days
+
+  EXPECT_THAT(state, Eq(DoodleState::AVAILABLE));
+  ASSERT_TRUE(response.has_value());
+  EXPECT_THAT(response.value().expiry_date,
+              Eq(TimeFromNow(30ul * 24 * 60 * 60 * 1000 /* ms */)));  // 30 days
+}
+
+TEST_F(DoodleFetcherTest, DoodleExpiresNowWithNegativeTTL) {
+  DoodleState state(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData(R"json({"ddljson": {
+      "time_to_live_ms":-1,
+      "large_image": {"url":"/logos/doodles/2015/some.gif"}
+    }})json");
+
+  EXPECT_THAT(state, Eq(DoodleState::AVAILABLE));
+  ASSERT_TRUE(response.has_value());
+  EXPECT_THAT(response.value().expiry_date, Eq(TimeFromNow(0)));
+}
+
+TEST_F(DoodleFetcherTest, DoodleExpiresNowWithoutValidTTL) {
+  DoodleState state(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData(R"json({"ddljson": {
+        "large_image": {"url":"/logos/doodles/2015/some.gif"}
+      }})json");
+
+  EXPECT_THAT(state, Eq(DoodleState::AVAILABLE));
+  ASSERT_TRUE(response.has_value());
+  EXPECT_THAT(response.value().expiry_date, Eq(TimeFromNow(0)));
+}
+
+TEST_F(DoodleFetcherTest, ReturnsNoDoodleForMissingLargeImageUrl) {
+  DoodleState state(DoodleState::AVAILABLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData(R"json({"ddljson": {
+        "time_to_live_ms":55000,
+        "large_image": {}
+      }})json");
+
+  EXPECT_THAT(state, Eq(DoodleState::NO_DOODLE));
+  EXPECT_FALSE(response.has_value());
+}
+
+TEST_F(DoodleFetcherTest, EmptyResponsesCausesNoDoodleState) {
+  DoodleState state(DoodleState::AVAILABLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData("{\"ddljson\":{}}");
+
+  EXPECT_THAT(state, Eq(DoodleState::NO_DOODLE));
+  EXPECT_FALSE(response.has_value());
+}
+
+TEST_F(DoodleFetcherTest, ResponseContainsExactlyTheSampleImages) {
+  DoodleState state(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response;
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state, &response));
+  RespondWithData(R"json()]}'{
+      "ddljson": {
+        "time_to_live_ms":55000,
+        "large_image": {
+          "height":225,
+          "is_animated_gif":true,
+          "is_cta":false,
+          "url":"/logos/doodles/2015/new-years-eve-2015-59854387958251-hp.gif",
+          "width":489
+        },
+        "large_cta_image": {
+          "height":225,
+          "is_animated_gif":true,
+          "is_cta":true,
+          "url":"/logos/doodles/2015/new-years-eve-2015-59854387958251-cta.gif",
+          "width":489
+        },
+        "transparent_large_image": {
+          "height":225,
+          "is_animated_gif":false,
+          "is_cta":false,
+          "url":"/logos/doodles/2015/new-years-eve-2015-59854387958251-thp.png",
+          "width":510
+        }
+      }})json");
+
+  EXPECT_THAT(state, Eq(DoodleState::AVAILABLE));
+  ASSERT_TRUE(response.has_value());
+  DoodleConfig config = response.value();
+
+  EXPECT_TRUE(config.transparent_large_image.url.is_valid());
+  EXPECT_THAT(config.transparent_large_image.url.spec(),
+              Eq(Resolve("/logos/doodles/2015/new-years-eve-2015-5985438795"
+                         "8251-thp.png")));
+  EXPECT_THAT(config.transparent_large_image.width, Eq(510));
+  EXPECT_THAT(config.transparent_large_image.height, Eq(225));
+  EXPECT_FALSE(config.transparent_large_image.is_animated_gif);
+  EXPECT_FALSE(config.transparent_large_image.is_cta);
+
+  EXPECT_TRUE(config.large_image.url.is_valid());
+  EXPECT_THAT(config.large_image.url.spec(),
+              Eq(Resolve("/logos/doodles/2015/new-years-eve-2015-5985438795"
+                         "8251-hp.gif")));
+  EXPECT_THAT(config.large_image.width, Eq(489));
+  EXPECT_THAT(config.large_image.height, Eq(225));
+  EXPECT_TRUE(config.large_image.is_animated_gif);
+  EXPECT_FALSE(config.large_image.is_cta);
+
+  EXPECT_TRUE(config.large_cta_image.url.is_valid());
+  EXPECT_THAT(config.large_cta_image.url.spec(),
+              Eq(Resolve("/logos/doodles/2015/new-years-eve-2015-5985438795"
+                         "8251-cta.gif")));
+  EXPECT_THAT(config.large_cta_image.width, Eq(489));
+  EXPECT_THAT(config.large_cta_image.height, Eq(225));
+  EXPECT_TRUE(config.large_cta_image.is_animated_gif);
+  EXPECT_TRUE(config.large_cta_image.is_cta);
+}
+
+TEST_F(DoodleFetcherTest, RespondsToMultipleRequestsWithSameFetcher) {
+  DoodleState state1(DoodleState::NO_DOODLE);
+  DoodleState state2(DoodleState::NO_DOODLE);
+  base::Optional<DoodleConfig> response1;
+  base::Optional<DoodleConfig> response2;
+
+  // Trigger two requests.
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state1, &response1));
+  net::URLFetcher* first_created_fetcher = GetRunningFetcher();
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(&state2, &response2));
+  net::URLFetcher* second_created_fetcher = GetRunningFetcher();
+
+  // Expect that only one fetcher handles both requests.
+  EXPECT_THAT(first_created_fetcher, Eq(second_created_fetcher));
+
+  RespondWithData(R"json({"ddljson": {
+        "time_to_live_ms":55000,
+        "large_image": {"url":"/logos/doodles/2015/some.gif"}
+      }})json");
+
+  // Ensure that both requests received a response.
+  EXPECT_THAT(state1, Eq(DoodleState::AVAILABLE));
+  EXPECT_TRUE(response1.has_value());
+  EXPECT_THAT(state2, Eq(DoodleState::AVAILABLE));
+  EXPECT_TRUE(response2.has_value());
+}
+
+TEST_F(DoodleFetcherTest, ReceivesBaseUrlFromTracker) {
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(/*state=*/nullptr, /*response=*/nullptr));
+
+  EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(),
+              Eq(GetGoogleBaseURL().Resolve(kDoodleConfigPath)));
+}
+
+TEST_F(DoodleFetcherTest, OverridesBaseUrlWithCommandLineArgument) {
+  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+      switches::kGoogleBaseURL, "http://www.google.kz");
+
+  doodle_fetcher()->FetchDoodle(
+      CreateResponseSavingCallback(/*state=*/nullptr, /*response=*/nullptr));
+
+  EXPECT_THAT(GetRunningFetcher()->GetOriginalURL(),
+              Eq(GURL("http://www.google.kz").Resolve(kDoodleConfigPath)));
+}
+
+}  // namespace doodle
diff --git a/components/payments/BUILD.gn b/components/payments/BUILD.gn
index a0bff06..3895da56 100644
--- a/components/payments/BUILD.gn
+++ b/components/payments/BUILD.gn
@@ -52,6 +52,8 @@
 
 static_library("payment_validation") {
   sources = [
+    "address_normalizer.cc",
+    "address_normalizer.h",
     "currency_formatter.cc",
     "currency_formatter.h",
     "payment_details_validation.cc",
@@ -63,12 +65,14 @@
   deps = [
     ":payment_request",
     "//base",
+    "//components/autofill/core/browser",
     "//third_party/re2:re2",
     "//url:url",
   ]
 
   public_deps = [
     "//third_party/icu:icu",
+    "//third_party/libaddressinput",
   ]
 }
 
diff --git a/components/payments/DEPS b/components/payments/DEPS
index 151fdf5f..002344e1 100644
--- a/components/payments/DEPS
+++ b/components/payments/DEPS
@@ -4,5 +4,6 @@
   "+content/public/browser",
 
   "+mojo/public/cpp",
+  "+third_party/libaddressinput", # For address i18n.
   "+third_party/re2",
 ]
diff --git a/components/payments/address_normalizer.cc b/components/payments/address_normalizer.cc
new file mode 100644
index 0000000..f8dd35a
--- /dev/null
+++ b/components/payments/address_normalizer.cc
@@ -0,0 +1,133 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/payments/address_normalizer.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/address_i18n.h"
+#include "third_party/libaddressinput/chromium/chrome_address_validator.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/source.h"
+#include "third_party/libaddressinput/src/cpp/include/libaddressinput/storage.h"
+
+namespace {
+using ::i18n::addressinput::Source;
+using ::i18n::addressinput::Storage;
+}  // namespace
+
+namespace payments {
+
+namespace {
+
+class AddressNormalizationRequest : public AddressNormalizer::Request {
+ public:
+  // The |delegate| and |address_validator| need to outlive this Request.
+  AddressNormalizationRequest(const AutofillProfile& profile,
+                              const std::string& region_code,
+                              AddressNormalizer::Delegate* delegate,
+                              autofill::AddressValidator* address_validator)
+      : profile_(profile),
+        region_code_(region_code),
+        delegate_(delegate),
+        address_validator_(address_validator) {}
+
+  ~AddressNormalizationRequest() override {}
+
+  void OnRulesLoaded(bool success) override {
+    if (!success) {
+      delegate_->OnCouldNotNormalize(profile_);
+      return;
+    }
+
+    DCHECK(address_validator_->AreRulesLoadedForRegion(region_code_));
+
+    // Create the AddressData from the profile.
+    ::i18n::addressinput::AddressData address_data =
+        *autofill::i18n::CreateAddressDataFromAutofillProfile(profile_,
+                                                              region_code_);
+
+    // Normalize the address.
+    if (address_validator_ &&
+        address_validator_->NormalizeAddress(&address_data)) {
+      profile_.SetRawInfo(autofill::ADDRESS_HOME_STATE,
+                          base::UTF8ToUTF16(address_data.administrative_area));
+      profile_.SetRawInfo(autofill::ADDRESS_HOME_CITY,
+                          base::UTF8ToUTF16(address_data.locality));
+      profile_.SetRawInfo(autofill::ADDRESS_HOME_DEPENDENT_LOCALITY,
+                          base::UTF8ToUTF16(address_data.dependent_locality));
+    }
+
+    delegate_->OnAddressNormalized(profile_);
+  }
+
+ private:
+  AutofillProfile profile_;
+  std::string region_code_;
+  AddressNormalizer::Delegate* delegate_;
+  autofill::AddressValidator* address_validator_;
+
+  DISALLOW_COPY_AND_ASSIGN(AddressNormalizationRequest);
+};
+
+}  // namespace
+
+AddressNormalizer::AddressNormalizer(std::unique_ptr<Source> source,
+                                     std::unique_ptr<Storage> storage)
+    : address_validator_(std::move(source), std::move(storage), this) {}
+
+AddressNormalizer::~AddressNormalizer() {}
+
+void AddressNormalizer::LoadRulesForRegion(const std::string& region_code) {
+  address_validator_.LoadRules(region_code);
+}
+
+bool AddressNormalizer::AreRulesLoadedForRegion(
+    const std::string& region_code) {
+  return address_validator_.AreRulesLoadedForRegion(region_code);
+}
+
+void AddressNormalizer::StartAddressNormalization(
+    const AutofillProfile& profile,
+    const std::string& region_code,
+    AddressNormalizer::Delegate* requester) {
+  std::unique_ptr<AddressNormalizationRequest> request(
+      new AddressNormalizationRequest(profile, region_code, requester,
+                                      &address_validator_));
+
+  // Check if the rules are already loaded.
+  if (AreRulesLoadedForRegion(region_code)) {
+    request->OnRulesLoaded(true);
+  } else {
+    // Setup the variables so the profile gets normalized when the rules have
+    // finished loading.
+    auto it = pending_normalization_.find(region_code);
+    if (it == pending_normalization_.end()) {
+      // If no entry exists yet, create the entry and assign it to |it|.
+      it = pending_normalization_
+               .insert(std::make_pair(region_code,
+                                      std::vector<std::unique_ptr<Request>>()))
+               .first;
+    }
+
+    it->second.push_back(std::move(request));
+  }
+}
+
+void AddressNormalizer::OnAddressValidationRulesLoaded(
+    const std::string& region_code,
+    bool success) {
+  // Check if an address normalization is pending.
+  auto it = pending_normalization_.find(region_code);
+  if (it != pending_normalization_.end()) {
+    for (size_t i = 0; i < it->second.size(); ++i) {
+      it->second[i]->OnRulesLoaded(success);
+    }
+    pending_normalization_.erase(it);
+  }
+}
+
+}  // namespace payments
\ No newline at end of file
diff --git a/components/payments/address_normalizer.h b/components/payments/address_normalizer.h
new file mode 100644
index 0000000..d2f24c5
--- /dev/null
+++ b/components/payments/address_normalizer.h
@@ -0,0 +1,77 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PAYMENTS_ADDRESS_NORMALIZER_H_
+#define COMPONENTS_PAYMENTS_ADDRESS_NORMALIZER_H_
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "components/autofill/core/browser/autofill_profile.h"
+#include "third_party/libaddressinput/chromium/chrome_address_validator.h"
+
+using autofill::AutofillProfile;
+
+namespace payments {
+
+// A class used to normalize addresses.
+class AddressNormalizer : public autofill::LoadRulesListener,
+                          public base::SupportsWeakPtr<AddressNormalizer> {
+ public:
+  // The interface for the normalization delegates.
+  class Delegate {
+   public:
+    virtual void OnAddressNormalized(
+        const autofill::AutofillProfile& normalized_profile) = 0;
+
+    virtual void OnCouldNotNormalize(
+        const autofill::AutofillProfile& profile) = 0;
+
+   protected:
+    virtual ~Delegate() {}
+  };
+
+  // The interface for the normalization request.
+  class Request {
+   public:
+    virtual void OnRulesLoaded(bool success) = 0;
+    virtual ~Request() {}
+  };
+
+  AddressNormalizer(std::unique_ptr<i18n::addressinput::Source> source,
+                    std::unique_ptr<i18n::addressinput::Storage> storage);
+  ~AddressNormalizer() override;
+
+  // Start loading the validation rules for the specified |region_code|.
+  void LoadRulesForRegion(const std::string& region_code);
+
+  // Returns whether the rules for the specified |region_code| have finished
+  // loading.
+  bool AreRulesLoadedForRegion(const std::string& region_code);
+
+  // Starts the normalization of the |profile| based on the |region_code|. The
+  // normalized profile will be returned to the |requester| possibly
+  // asynchronously.
+  void StartAddressNormalization(const autofill::AutofillProfile& profile,
+                                 const std::string& region_code,
+                                 Delegate* requester);
+
+ private:
+  // Called when the validation rules for the |region_code| have finished
+  // loading. Implementation of the LoadRulesListener interface.
+  void OnAddressValidationRulesLoaded(const std::string& region_code,
+                                      bool success) override;
+
+  // Map associating a region code to pending normalizations.
+  std::map<std::string, std::vector<std::unique_ptr<Request>>>
+      pending_normalization_;
+
+  // The address validator used to normalize addresses.
+  autofill::AddressValidator address_validator_;
+
+  DISALLOW_COPY_AND_ASSIGN(AddressNormalizer);
+};
+
+}  // namespace payments
+
+#endif  // COMPONENTS_PAYMENTS_ADDRESS_NORMALIZER_H_
diff --git a/components/supervised_user_error_page/BUILD.gn b/components/supervised_user_error_page/BUILD.gn
index d4780d4..d228d8b 100644
--- a/components/supervised_user_error_page/BUILD.gn
+++ b/components/supervised_user_error_page/BUILD.gn
@@ -2,6 +2,10 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+if (is_android) {
+  import("//build/config/android/rules.gni")
+}
+
 static_library("supervised_user_error_page") {
   sources = [
     "supervised_user_error_page.cc",
@@ -41,6 +45,14 @@
   }
 }
 
+if (is_android) {
+  java_cpp_enum("enums_srcjar") {
+    sources = [
+      "supervised_user_error_page.h",
+    ]
+  }
+}
+
 source_set("unit_tests") {
   testonly = true
   sources = [
diff --git a/components/supervised_user_error_page/supervised_user_error_page.cc b/components/supervised_user_error_page/supervised_user_error_page.cc
index 085581b..ac28f6f3 100644
--- a/components/supervised_user_error_page/supervised_user_error_page.cc
+++ b/components/supervised_user_error_page/supervised_user_error_page.cc
@@ -61,6 +61,8 @@
       if (single_parent)
         return IDS_CHILD_BLOCK_MESSAGE_MANUAL_SINGLE_PARENT;
       return IDS_CHILD_BLOCK_MESSAGE_MANUAL_MULTI_PARENT;
+    case NOT_SIGNED_IN:
+      return IDS_SUPERVISED_USER_NOT_SIGNED_IN;
   }
   NOTREACHED();
   return 0;
@@ -96,7 +98,10 @@
                     base::UTF8ToUTF16(second_custodian_email));
   base::string16 block_header;
   base::string16 block_message;
-  if (allow_access_requests) {
+  if (reason == FilteringBehaviorReason::NOT_SIGNED_IN) {
+    block_header =
+        l10n_util::GetStringUTF16(IDS_BLOCK_INTERSTITIAL_HEADER_NOT_SIGNED_IN);
+  } else if (allow_access_requests) {
     if (is_child_account) {
       block_header =
           l10n_util::GetStringUTF16(IDS_CHILD_BLOCK_INTERSTITIAL_HEADER);
diff --git a/components/supervised_user_error_page/supervised_user_error_page.h b/components/supervised_user_error_page/supervised_user_error_page.h
index 01ca3e2..66456f2b 100644
--- a/components/supervised_user_error_page/supervised_user_error_page.h
+++ b/components/supervised_user_error_page/supervised_user_error_page.h
@@ -9,12 +9,15 @@
 
 namespace supervised_user_error_page {
 
+// A Java counterpart will be generated for this enum.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.components.supervisedusererrorpage
 enum FilteringBehaviorReason {
-  DEFAULT,
-  ASYNC_CHECKER,
-  BLACKLIST,
-  MANUAL,
-  WHITELIST
+  DEFAULT = 0,
+  ASYNC_CHECKER = 1,
+  BLACKLIST = 2,
+  MANUAL = 3,
+  WHITELIST = 4,
+  NOT_SIGNED_IN = 5,
 };
 
 int GetBlockMessageID(
diff --git a/components/supervised_user_error_page_strings.grdp b/components/supervised_user_error_page_strings.grdp
index 4f881a8..de4c44a 100644
--- a/components/supervised_user_error_page_strings.grdp
+++ b/components/supervised_user_error_page_strings.grdp
@@ -13,6 +13,9 @@
       <message name="IDS_BLOCK_INTERSTITIAL_HEADER_ACCESS_REQUESTS_DISABLED" desc="A heading for the supervised user when they attempt to visit a site that is not permitted by the manager (and they can't ask for permission).">
         Looks like you don't have permission to visit this site
       </message>
+      <message name="IDS_BLOCK_INTERSTITIAL_HEADER_NOT_SIGNED_IN" desc="A heading for the supervised user when the status cannot be established because they haven't signed in to Chrome).">
+        Please start and sign in to Chrome before using this app.
+      </message>
       <message name="IDS_CHILD_BLOCK_INTERSTITIAL_MESSAGE" desc="A message for the child user when they attempt to visit a site that is not permitted by their parent.">
         Looks like you need permission to visit this site
       </message>
@@ -73,5 +76,8 @@
       <message name="IDS_SUPERVISED_USER_BLOCK_MESSAGE_MANUAL" desc="Message to be shown to a supervised user when a site is blocked due to a manual blacklist entry">
         Your manager can unblock it for you
       </message>
+      <message name="IDS_SUPERVISED_USER_NOT_SIGNED_IN" desc="Message to be shown to a supervised user who is not signed in to Chrome">
+        Please start and sign in to Chrome so that Chrome can check whether you are allowed to access this site.
+      </message>
 
 </grit-part>
diff --git a/components/tracing/BUILD.gn b/components/tracing/BUILD.gn
index b73c3d6..deab4a6 100644
--- a/components/tracing/BUILD.gn
+++ b/components/tracing/BUILD.gn
@@ -50,8 +50,10 @@
 
 component("startup_tracing") {
   sources = [
-    "browser/trace_config_file.cc",
-    "browser/trace_config_file.h",
+    "common/trace_config_file.cc",
+    "common/trace_config_file.h",
+    "common/trace_startup.cc",
+    "common/trace_startup.h",
     "common/trace_to_console.cc",
     "common/trace_to_console.h",
     "common/tracing_switches.cc",
@@ -113,7 +115,7 @@
   ]
 
   if (!is_android) {
-    sources += [ "browser/trace_config_file_unittest.cc" ]
+    sources += [ "common/trace_config_file_unittest.cc" ]
     deps += [ ":startup_tracing" ]
   }
 }
diff --git a/components/tracing/browser/trace_config_file.cc b/components/tracing/common/trace_config_file.cc
similarity index 95%
rename from components/tracing/browser/trace_config_file.cc
rename to components/tracing/common/trace_config_file.cc
index 97f8a168..1808344 100644
--- a/components/tracing/browser/trace_config_file.cc
+++ b/components/tracing/common/trace_config_file.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/tracing/browser/trace_config_file.h"
+#include "components/tracing/common/trace_config_file.h"
 
 #include <stddef.h>
 
@@ -41,7 +41,7 @@
 const char kStartupDurationParam[] = "startup_duration";
 const char kResultFileParam[] = "result_file";
 
-} // namespace
+}  // namespace
 
 TraceConfigFile* TraceConfigFile::GetInstance() {
   return base::Singleton<TraceConfigFile,
@@ -93,8 +93,7 @@
     DLOG(WARNING) << "Cannot parse the trace config file correctly.";
 }
 
-TraceConfigFile::~TraceConfigFile() {
-}
+TraceConfigFile::~TraceConfigFile() {}
 
 bool TraceConfigFile::ParseTraceConfigFileContent(const std::string& content) {
   std::unique_ptr<base::Value> value(base::JSONReader::Read(content));
@@ -111,10 +110,10 @@
   trace_config_ = base::trace_event::TraceConfig(*trace_config_dict);
 
   if (!dict->GetInteger(kStartupDurationParam, &startup_duration_))
-      startup_duration_ = 0;
+    startup_duration_ = 0;
 
   if (startup_duration_ < 0)
-      startup_duration_ = 0;
+    startup_duration_ = 0;
 
   base::FilePath::StringType result_file_str;
   if (dict->GetString(kResultFileParam, &result_file_str))
diff --git a/components/tracing/browser/trace_config_file.h b/components/tracing/common/trace_config_file.h
similarity index 93%
rename from components/tracing/browser/trace_config_file.h
rename to components/tracing/common/trace_config_file.h
index 06766d0ec..31adcef 100644
--- a/components/tracing/browser/trace_config_file.h
+++ b/components/tracing/common/trace_config_file.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_TRACING_BROWSER_TRACE_CONFIG_FILE_H_
-#define COMPONENTS_TRACING_BROWSER_TRACE_CONFIG_FILE_H_
+#ifndef COMPONENTS_TRACING_COMMON_TRACE_CONFIG_FILE_H_
+#define COMPONENTS_TRACING_COMMON_TRACE_CONFIG_FILE_H_
 
 #include "base/files/file_path.h"
 #include "base/macros.h"
@@ -12,7 +12,8 @@
 #include "components/tracing/tracing_export.h"
 
 namespace base {
-template <typename Type> struct DefaultSingletonTraits;
+template <typename Type>
+struct DefaultSingletonTraits;
 }  // namespace base
 
 namespace tracing {
@@ -94,4 +95,4 @@
 
 }  // namespace tracing
 
-#endif  // COMPONENTS_TRACING_BROWSER_TRACE_CONFIG_FILE_H_
+#endif  // COMPONENTS_TRACING_COMMON_TRACE_CONFIG_FILE_H_
diff --git a/components/tracing/browser/trace_config_file_unittest.cc b/components/tracing/common/trace_config_file_unittest.cc
similarity index 85%
rename from components/tracing/browser/trace_config_file_unittest.cc
rename to components/tracing/common/trace_config_file_unittest.cc
index 7920a5e..2c7df54 100644
--- a/components/tracing/browser/trace_config_file_unittest.cc
+++ b/components/tracing/common/trace_config_file_unittest.cc
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "components/tracing/common/trace_config_file.h"
+
 #include "base/at_exit.h"
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
-#include "components/tracing/browser/trace_config_file.h"
 #include "components/tracing/common/tracing_switches.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -49,12 +50,11 @@
   return content;
 }
 
-} // namespace
+}  // namespace
 
 TEST(TraceConfigFileTest, TraceStartupEnabled) {
   base::ShadowingAtExitManager sem;
-  base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kTraceStartup);
+  base::CommandLine::ForCurrentProcess()->AppendSwitch(switches::kTraceStartup);
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       switches::kTraceConfigFile);
 
@@ -100,16 +100,16 @@
 
 TEST(TraceConfigFileTest, ValidContent) {
   base::ShadowingAtExitManager sem;
-  std::string content = GetTraceConfigFileContent(
-      kTraceConfig, "10", "trace_result_file.log");
+  std::string content =
+      GetTraceConfigFileContent(kTraceConfig, "10", "trace_result_file.log");
 
   base::FilePath trace_config_file;
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   ASSERT_TRUE(
       base::CreateTemporaryFileInDir(temp_dir.GetPath(), &trace_config_file));
-  ASSERT_NE(-1, base::WriteFile(
-      trace_config_file, content.c_str(), (int)content.length()));
+  ASSERT_NE(-1, base::WriteFile(trace_config_file, content.c_str(),
+                                (int)content.length()));
   base::CommandLine::ForCurrentProcess()->AppendSwitchPath(
       switches::kTraceConfigFile, trace_config_file);
 
@@ -131,8 +131,8 @@
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   ASSERT_TRUE(
       base::CreateTemporaryFileInDir(temp_dir.GetPath(), &trace_config_file));
-  ASSERT_NE(-1, base::WriteFile(
-      trace_config_file, content.c_str(), (int)content.length()));
+  ASSERT_NE(-1, base::WriteFile(trace_config_file, content.c_str(),
+                                (int)content.length()));
   base::CommandLine::ForCurrentProcess()->AppendSwitchPath(
       switches::kTraceConfigFile, trace_config_file);
 
@@ -155,20 +155,20 @@
   ASSERT_TRUE(result_file_path.IsAbsolute());
 
   std::string result_file_path_str = result_file_path.AsUTF8Unsafe();
-  auto it = std::find(
-      result_file_path_str.begin(), result_file_path_str.end(), '\\');
+  auto it =
+      std::find(result_file_path_str.begin(), result_file_path_str.end(), '\\');
   while (it != result_file_path_str.end()) {
     auto it2 = result_file_path_str.insert(it, '\\');
-    it = std::find(it2+2, result_file_path_str.end(), '\\');
+    it = std::find(it2 + 2, result_file_path_str.end(), '\\');
   }
-  std::string content = GetTraceConfigFileContent(
-      kTraceConfig, "10", result_file_path_str);
+  std::string content =
+      GetTraceConfigFileContent(kTraceConfig, "10", result_file_path_str);
 
   base::FilePath trace_config_file;
   ASSERT_TRUE(
       base::CreateTemporaryFileInDir(temp_dir.GetPath(), &trace_config_file));
-  ASSERT_NE(-1, base::WriteFile(
-      trace_config_file, content.c_str(), (int)content.length()));
+  ASSERT_NE(-1, base::WriteFile(trace_config_file, content.c_str(),
+                                (int)content.length()));
   base::CommandLine::ForCurrentProcess()->AppendSwitchPath(
       switches::kTraceConfigFile, trace_config_file);
 
@@ -185,8 +185,8 @@
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   ASSERT_TRUE(
       base::CreateTemporaryFileInDir(temp_dir.GetPath(), &trace_config_file));
-  ASSERT_NE(-1, base::WriteFile(
-      trace_config_file, content.c_str(), (int)content.length()));
+  ASSERT_NE(-1, base::WriteFile(trace_config_file, content.c_str(),
+                                (int)content.length()));
   base::CommandLine::ForCurrentProcess()->AppendSwitchPath(
       switches::kTraceConfigFile, trace_config_file);
 
@@ -201,16 +201,16 @@
 
 TEST(TraceConfigFileTest, ContentWithoutTraceConfig) {
   base::ShadowingAtExitManager sem;
-  std::string content = GetTraceConfigFileContent(
-      "", "10", "trace_result_file.log");
+  std::string content =
+      GetTraceConfigFileContent("", "10", "trace_result_file.log");
 
   base::FilePath trace_config_file;
   base::ScopedTempDir temp_dir;
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   ASSERT_TRUE(
       base::CreateTemporaryFileInDir(temp_dir.GetPath(), &trace_config_file));
-  ASSERT_NE(-1, base::WriteFile(
-      trace_config_file, content.c_str(), (int)content.length()));
+  ASSERT_NE(-1, base::WriteFile(trace_config_file, content.c_str(),
+                                (int)content.length()));
   base::CommandLine::ForCurrentProcess()->AppendSwitchPath(
       switches::kTraceConfigFile, trace_config_file);
 
@@ -226,8 +226,8 @@
   ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
   ASSERT_TRUE(
       base::CreateTemporaryFileInDir(temp_dir.GetPath(), &trace_config_file));
-  ASSERT_NE(-1, base::WriteFile(
-      trace_config_file, content.c_str(), (int)content.length()));
+  ASSERT_NE(-1, base::WriteFile(trace_config_file, content.c_str(),
+                                (int)content.length()));
   base::CommandLine::ForCurrentProcess()->AppendSwitchPath(
       switches::kTraceConfigFile, trace_config_file);
 
@@ -247,4 +247,4 @@
   EXPECT_FALSE(TraceConfigFile::GetInstance()->IsEnabled());
 }
 
-} // namespace tracing
+}  // namespace tracing
diff --git a/components/tracing/common/trace_startup.cc b/components/tracing/common/trace_startup.cc
new file mode 100644
index 0000000..2c8ae37
--- /dev/null
+++ b/components/tracing/common/trace_startup.cc
@@ -0,0 +1,48 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/tracing/common/trace_startup.h"
+
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/trace_event/memory_dump_manager.h"
+#include "base/trace_event/trace_log.h"
+#include "components/tracing/common/trace_config_file.h"
+#include "components/tracing/common/trace_to_console.h"
+#include "components/tracing/common/tracing_switches.h"
+
+namespace tracing {
+
+void EnableStartupTracingIfNeeded(bool can_access_file_system) {
+  const base::CommandLine& command_line =
+      *base::CommandLine::ForCurrentProcess();
+
+  // Enables heap profiling if "--enable-heap-profiling" flag is passed.
+  base::trace_event::MemoryDumpManager::GetInstance()
+      ->EnableHeapProfilingIfNeeded();
+
+  if (command_line.HasSwitch(switches::kTraceStartup)) {
+    base::trace_event::TraceConfig trace_config(
+        command_line.GetSwitchValueASCII(switches::kTraceStartup),
+        base::trace_event::RECORD_UNTIL_FULL);
+    base::trace_event::TraceLog::GetInstance()->SetEnabled(
+        trace_config, base::trace_event::TraceLog::RECORDING_MODE);
+  } else if (command_line.HasSwitch(switches::kTraceToConsole)) {
+    base::trace_event::TraceConfig trace_config =
+        tracing::GetConfigForTraceToConsole();
+    LOG(ERROR) << "Start " << switches::kTraceToConsole
+               << " with CategoryFilter '"
+               << trace_config.ToCategoryFilterString() << "'.";
+    base::trace_event::TraceLog::GetInstance()->SetEnabled(
+        trace_config, base::trace_event::TraceLog::RECORDING_MODE);
+  } else if (can_access_file_system &&
+             tracing::TraceConfigFile::GetInstance()->IsEnabled()) {
+    // This checks kTraceConfigFile switch.
+    base::trace_event::TraceLog::GetInstance()->SetEnabled(
+        tracing::TraceConfigFile::GetInstance()->GetTraceConfig(),
+        base::trace_event::TraceLog::RECORDING_MODE);
+  }
+}
+
+}  // namespace tracing
diff --git a/components/tracing/common/trace_startup.h b/components/tracing/common/trace_startup.h
new file mode 100644
index 0000000..4a388d8
--- /dev/null
+++ b/components/tracing/common/trace_startup.h
@@ -0,0 +1,19 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_TRACING_COMMON_TRACE_STARTUP_H
+#define COMPONENTS_TRACING_COMMON_TRACE_STARTUP_H
+
+#include "components/tracing/tracing_export.h"
+
+namespace tracing {
+
+// Enables TraceLog with config based on the command line flags of the process.
+// If |can_access_file_system| is false then TraceLog is not enabled in case it
+// is required to read config file to start tracing.
+void TRACING_EXPORT EnableStartupTracingIfNeeded(bool can_access_file_system);
+
+}  // namespace tracing
+
+#endif  // COMPONENTS_TRACING_COMMON_TRACE_STARTUP_H
diff --git a/content/app/android/library_loader_hooks.cc b/content/app/android/library_loader_hooks.cc
index 8d16801..293cbde 100644
--- a/content/app/android/library_loader_hooks.cc
+++ b/content/app/android/library_loader_hooks.cc
@@ -17,9 +17,7 @@
 #include "base/strings/string_util.h"
 #include "base/trace_event/trace_event.h"
 #include "base/tracked_objects.h"
-#include "components/tracing/browser/trace_config_file.h"
-#include "components/tracing/common/trace_to_console.h"
-#include "components/tracing/common/tracing_switches.h"
+#include "components/tracing/common/trace_startup.h"
 #include "content/app/android/app_jni_registrar.h"
 #include "content/browser/android/browser_jni_registrar.h"
 #include "content/common/android/common_jni_registrar.h"
@@ -119,29 +117,8 @@
 }
 
 bool LibraryLoaded(JNIEnv* env, jclass clazz) {
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-
   // Enable startup tracing asap to avoid early TRACE_EVENT calls being ignored.
-  if (command_line->HasSwitch(switches::kTraceStartup)) {
-    base::trace_event::TraceConfig trace_config(
-        command_line->GetSwitchValueASCII(switches::kTraceStartup), "");
-    base::trace_event::TraceLog::GetInstance()->SetEnabled(
-        trace_config, base::trace_event::TraceLog::RECORDING_MODE);
-  } else if (command_line->HasSwitch(switches::kTraceToConsole)) {
-      base::trace_event::TraceConfig trace_config =
-          tracing::GetConfigForTraceToConsole();
-      LOG(ERROR) << "Start " << switches::kTraceToConsole
-                 << " with CategoryFilter '"
-                 << trace_config.ToCategoryFilterString() << "'.";
-      base::trace_event::TraceLog::GetInstance()->SetEnabled(
-          trace_config,
-          base::trace_event::TraceLog::RECORDING_MODE);
-  } else if (tracing::TraceConfigFile::GetInstance()->IsEnabled()) {
-    // This checks kTraceConfigFile switch.
-    base::trace_event::TraceLog::GetInstance()->SetEnabled(
-        tracing::TraceConfigFile::GetInstance()->GetTraceConfig(),
-        base::trace_event::TraceLog::RECORDING_MODE);
-  }
+  tracing::EnableStartupTracingIfNeeded(true /* can_access_file_system */);
 
   // Android's main browser loop is custom so we set the browser
   // name here as early as possible.
diff --git a/content/app/content_main_runner.cc b/content/app/content_main_runner.cc
index 5d799dc..9c3d133 100644
--- a/content/app/content_main_runner.cc
+++ b/content/app/content_main_runner.cc
@@ -42,9 +42,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "components/tracing/browser/trace_config_file.h"
-#include "components/tracing/common/trace_to_console.h"
-#include "components/tracing/common/tracing_switches.h"
+#include "components/tracing/common/trace_startup.h"
 #include "content/app/mojo/mojo_init.h"
 #include "content/common/set_process_title.h"
 #include "content/common/url_schemes.h"
@@ -661,31 +659,12 @@
     // Enable startup tracing asap to avoid early TRACE_EVENT calls being
     // ignored. For Android, startup tracing is enabled in an even earlier place
     // content/app/android/library_loader_hooks.cc.
-    if (command_line.HasSwitch(switches::kTraceStartup)) {
-      base::trace_event::TraceConfig trace_config(
-          command_line.GetSwitchValueASCII(switches::kTraceStartup),
-          base::trace_event::RECORD_UNTIL_FULL);
-      base::trace_event::TraceLog::GetInstance()->SetEnabled(
-          trace_config,
-          base::trace_event::TraceLog::RECORDING_MODE);
-    } else if (command_line.HasSwitch(switches::kTraceToConsole)) {
-      base::trace_event::TraceConfig trace_config =
-          tracing::GetConfigForTraceToConsole();
-      LOG(ERROR) << "Start " << switches::kTraceToConsole
-                 << " with CategoryFilter '"
-                 << trace_config.ToCategoryFilterString() << "'.";
-      base::trace_event::TraceLog::GetInstance()->SetEnabled(
-          trace_config,
-          base::trace_event::TraceLog::RECORDING_MODE);
-    } else if (process_type != switches::kZygoteProcess &&
-               process_type != switches::kRendererProcess) {
-      if (tracing::TraceConfigFile::GetInstance()->IsEnabled()) {
-        // This checks kTraceConfigFile switch.
-        base::trace_event::TraceLog::GetInstance()->SetEnabled(
-            tracing::TraceConfigFile::GetInstance()->GetTraceConfig(),
-            base::trace_event::TraceLog::RECORDING_MODE);
-      }
-    }
+    // Zygote process does not have file thread and renderer process on Win10
+    // cannot access the file system.
+    // TODO(ssid): Check if other processes can enable startup tracing here.
+    bool can_access_file_system = (process_type != switches::kZygoteProcess &&
+                                   process_type != switches::kRendererProcess);
+    tracing::EnableStartupTracingIfNeeded(can_access_file_system);
 #endif  // !OS_ANDROID
 
 #if defined(OS_WIN)
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index c8d27f5..0aac4d6 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -238,10 +238,8 @@
     "accessibility/browser_accessibility_win.h",
     "accessibility/one_shot_accessibility_tree_search.cc",
     "accessibility/one_shot_accessibility_tree_search.h",
-    "android/app_web_message_port_message_filter.cc",
-    "android/app_web_message_port_message_filter.h",
-    "android/app_web_message_port_service_impl.cc",
-    "android/app_web_message_port_service_impl.h",
+    "android/app_web_message_port.cc",
+    "android/app_web_message_port.h",
     "android/background_sync_network_observer_android.cc",
     "android/background_sync_network_observer_android.h",
     "android/browser_jni_registrar.cc",
@@ -261,6 +259,8 @@
     "android/java_interfaces_impl.h",
     "android/scoped_surface_request_manager.cc",
     "android/scoped_surface_request_manager.h",
+    "android/string_message_codec.cc",
+    "android/string_message_codec.h",
     "android/url_request_content_job.cc",
     "android/url_request_content_job.h",
     "appcache/appcache.cc",
@@ -941,11 +941,7 @@
     "memory/memory_pressure_controller_impl.h",
     "memory/memory_state_updater.cc",
     "memory/memory_state_updater.h",
-    "message_port_message_filter.cc",
-    "message_port_message_filter.h",
     "message_port_provider.cc",
-    "message_port_service.cc",
-    "message_port_service.h",
     "mime_registry_impl.cc",
     "mime_registry_impl.h",
     "net/browser_online_state_observer.cc",
diff --git a/content/browser/android/DEPS b/content/browser/android/DEPS
new file mode 100644
index 0000000..81b3fee
--- /dev/null
+++ b/content/browser/android/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+v8",  # To support unit tests.
+]
diff --git a/content/browser/android/app_web_message_port.cc b/content/browser/android/app_web_message_port.cc
new file mode 100644
index 0000000..2e7622c
--- /dev/null
+++ b/content/browser/android/app_web_message_port.cc
@@ -0,0 +1,167 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/android/app_web_message_port.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "base/bind.h"
+#include "content/browser/android/string_message_codec.h"
+#include "jni/AppWebMessagePort_jni.h"
+
+namespace content {
+
+// static
+void AppWebMessagePort::CreateAndBindToJavaObject(
+    JNIEnv* env,
+    mojo::ScopedMessagePipeHandle handle,
+    const base::android::JavaRef<jobject>& jobject) {
+  AppWebMessagePort* instance =
+      new AppWebMessagePort(env, std::move(handle), jobject);
+  Java_AppWebMessagePort_setNativeAppWebMessagePort(
+      env, jobject, reinterpret_cast<jlong>(instance));
+}
+
+// static
+std::vector<MessagePort> AppWebMessagePort::UnwrapJavaArray(
+    JNIEnv* env,
+    const base::android::JavaRef<jobjectArray>& jports) {
+  std::vector<MessagePort> ports;
+  if (!jports.is_null()) {
+    jsize num_ports = env->GetArrayLength(jports.obj());
+    for (jsize i = 0; i < num_ports; ++i) {
+      base::android::ScopedJavaLocalRef<jobject> jport(
+          env, env->GetObjectArrayElement(jports.obj(), i));
+      jlong native_port =
+          Java_AppWebMessagePort_releaseNativePortForTransfer(env, jport);
+      // Uninitialized ports should be trapper earlier at the Java layer.
+      DCHECK(native_port != -1);
+      AppWebMessagePort* instance =
+          reinterpret_cast<AppWebMessagePort*>(native_port);
+      ports.push_back(instance->port_);  // Transfers ownership.
+      delete instance;
+    }
+  }
+  return ports;
+}
+
+void AppWebMessagePort::CloseMessagePort(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller) {
+  // Explicitly reset the port here to ensure that OnMessagesAvailable has
+  // finished before we destroy this.
+  port_ = MessagePort();
+
+  delete this;
+}
+
+void AppWebMessagePort::PostMessage(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller,
+    const base::android::JavaParamRef<jstring>& jmessage,
+    const base::android::JavaParamRef<jobjectArray>& jports) {
+  port_.PostMessage(
+      EncodeStringMessage(base::android::ConvertJavaStringToUTF16(jmessage)),
+      UnwrapJavaArray(env, jports));
+}
+
+jboolean AppWebMessagePort::DispatchNextMessage(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller) {
+  base::android::ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+  if (obj.is_null())
+    return false;
+
+  jmethodID app_web_message_port_constructor =
+      base::android::MethodID::Get<base::android::MethodID::TYPE_INSTANCE>(
+          env, AppWebMessagePort_clazz(env), "<init>", "()V");
+
+  base::string16 encoded_message;
+  std::vector<MessagePort> ports;
+  if (!port_.GetMessage(&encoded_message, &ports))
+    return false;
+
+  base::string16 message;
+  if (!DecodeStringMessage(encoded_message, &message))
+    return false;
+
+  base::android::ScopedJavaLocalRef<jstring> jmessage =
+      base::android::ConvertUTF16ToJavaString(env, message);
+
+  base::android::ScopedJavaLocalRef<jobjectArray> jports;
+  if (ports.size() > 0) {
+    jports = base::android::ScopedJavaLocalRef<jobjectArray>(
+        env,
+        env->NewObjectArray(ports.size(),
+                            AppWebMessagePort_clazz(env),
+                            nullptr));
+
+    // Instantiate the Java and C++ wrappers for the transferred ports.
+    for (size_t i = 0; i < ports.size(); ++i) {
+      base::android::ScopedJavaLocalRef<jobject> jport(
+          env,
+          env->NewObject(AppWebMessagePort_clazz(env),
+                         app_web_message_port_constructor));
+      CreateAndBindToJavaObject(env, ports[i].ReleaseHandle(), jport);
+
+      env->SetObjectArrayElement(jports.obj(), i, jport.obj());
+    }
+  }
+
+  Java_AppWebMessagePort_onReceivedMessage(env, obj, jmessage, jports);
+  return true;
+}
+
+void AppWebMessagePort::StartReceivingMessages(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller) {
+  port_.SetCallback(
+      base::Bind(&AppWebMessagePort::OnMessagesAvailable,
+                 base::Unretained(this)));
+}
+
+AppWebMessagePort::AppWebMessagePort(
+    JNIEnv* env,
+    mojo::ScopedMessagePipeHandle handle,
+    const base::android::JavaRef<jobject>& jobject)
+    : port_(std::move(handle)),
+      java_ref_(env, jobject) {
+}
+
+AppWebMessagePort::~AppWebMessagePort() {
+}
+
+void AppWebMessagePort::OnMessagesAvailable() {
+  // Called on a background thread.
+  JNIEnv* env = base::android::AttachCurrentThread();
+  base::android::ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+  if (obj.is_null())
+    return;
+  Java_AppWebMessagePort_onMessagesAvailable(env, obj);
+}
+
+bool RegisterAppWebMessagePort(JNIEnv* env) {
+  return RegisterNativesImpl(env);
+}
+
+void InitializeAppWebMessagePortPair(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jclass>& jcaller,
+    const base::android::JavaParamRef<jobjectArray>& ports) {
+  DCHECK_EQ(2, env->GetArrayLength(ports.obj()));
+
+  mojo::MessagePipe pipe;
+
+  base::android::ScopedJavaLocalRef<jobject> jport0(
+      env, env->GetObjectArrayElement(ports.obj(), 0));
+  AppWebMessagePort::CreateAndBindToJavaObject(
+      env, std::move(pipe.handle0), jport0);
+
+  base::android::ScopedJavaLocalRef<jobject> jport1(
+      env, env->GetObjectArrayElement(ports.obj(), 1));
+  AppWebMessagePort::CreateAndBindToJavaObject(
+      env, std::move(pipe.handle1), jport1);
+}
+
+}  // namespace content
diff --git a/content/browser/android/app_web_message_port.h b/content/browser/android/app_web_message_port.h
new file mode 100644
index 0000000..147c9f6
--- /dev/null
+++ b/content/browser/android/app_web_message_port.h
@@ -0,0 +1,59 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_H_
+#define CONTENT_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_H_
+
+#include "base/android/jni_weak_ref.h"
+#include "content/common/message_port.h"
+
+namespace content {
+
+class AppWebMessagePort {
+ public:
+  static void CreateAndBindToJavaObject(
+      JNIEnv* env,
+      mojo::ScopedMessagePipeHandle handle,
+      const base::android::JavaRef<jobject>& jobject);
+
+  static std::vector<MessagePort> UnwrapJavaArray(
+      JNIEnv* env,
+      const base::android::JavaRef<jobjectArray>& jports);
+
+  // Methods called from Java.
+  void CloseMessagePort(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jcaller);
+  void PostMessage(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jcaller,
+      const base::android::JavaParamRef<jstring>& jmessage,
+      const base::android::JavaParamRef<jobjectArray>& jports);
+  jboolean DispatchNextMessage(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jcaller);
+  void StartReceivingMessages(
+      JNIEnv* env,
+      const base::android::JavaParamRef<jobject>& jcaller);
+
+ private:
+  explicit AppWebMessagePort(
+      JNIEnv* env,
+      mojo::ScopedMessagePipeHandle handle,
+      const base::android::JavaRef<jobject>& jobject);
+  ~AppWebMessagePort();
+
+  void OnMessagesAvailable();
+
+  MessagePort port_;
+  JavaObjectWeakGlobalRef java_ref_;
+
+  DISALLOW_COPY_AND_ASSIGN(AppWebMessagePort);
+};
+
+bool RegisterAppWebMessagePort(JNIEnv* env);
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_H_
diff --git a/content/browser/android/app_web_message_port_message_filter.cc b/content/browser/android/app_web_message_port_message_filter.cc
deleted file mode 100644
index b95ea00f..0000000
--- a/content/browser/android/app_web_message_port_message_filter.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/android/app_web_message_port_message_filter.h"
-
-#include "content/browser/android/app_web_message_port_service_impl.h"
-#include "content/browser/message_port_service.h"
-#include "content/common/app_web_message_port_messages.h"
-#include "content/public/browser/android/app_web_message_port_service.h"
-#include "content/public/browser/message_port_provider.h"
-
-using content::BrowserThread;
-using content::MessagePortProvider;
-
-namespace content {
-
-AppWebMessagePortMessageFilter::AppWebMessagePortMessageFilter(int route_id)
-    : BrowserMessageFilter(AwMessagePortMsgStart), route_id_(route_id) {}
-
-AppWebMessagePortMessageFilter::~AppWebMessagePortMessageFilter() {}
-
-void AppWebMessagePortMessageFilter::OnChannelClosing() {
-  MessagePortService::GetInstance()->OnMessagePortDelegateClosing(this);
-  AppWebMessagePortServiceImpl::GetInstance()
-      ->OnMessagePortMessageFilterClosing(this);
-}
-
-bool AppWebMessagePortMessageFilter::OnMessageReceived(
-    const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(AppWebMessagePortMessageFilter, message)
-    IPC_MESSAGE_FORWARD(
-        AppWebMessagePortHostMsg_ConvertedWebToAppMessage,
-        AppWebMessagePortServiceImpl::GetInstance(),
-        AppWebMessagePortServiceImpl::OnConvertedWebToAppMessage)
-    IPC_MESSAGE_HANDLER(AppWebMessagePortHostMsg_ConvertedAppToWebMessage,
-                        OnConvertedAppToWebMessage)
-    IPC_MESSAGE_HANDLER(AppWebMessagePortHostMsg_ClosePortAck, OnClosePortAck)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
-}
-
-void AppWebMessagePortMessageFilter::OnConvertedAppToWebMessage(
-    int msg_port_id,
-    const base::string16& message,
-    const std::vector<int>& sent_message_port_ids) {
-  MessagePortService* msp = MessagePortService::GetInstance();
-  msp->PostMessage(msg_port_id, message, sent_message_port_ids);
-}
-
-void AppWebMessagePortMessageFilter::OnClosePortAck(int message_port_id) {
-  MessagePortService* msp = MessagePortService::GetInstance();
-  msp->ClosePort(message_port_id);
-  AppWebMessagePortServiceImpl::GetInstance()->CleanupPort(message_port_id);
-}
-
-void AppWebMessagePortMessageFilter::OnDestruct() const {
-  BrowserThread::DeleteOnIOThread::Destruct(this);
-}
-
-void AppWebMessagePortMessageFilter::SendAppToWebMessage(
-    int msg_port_route_id,
-    const base::string16& message,
-    const std::vector<int>& sent_message_port_ids) {
-  Send(new AppWebMessagePortMsg_AppToWebMessage(
-      route_id_,
-      msg_port_route_id,  // same as the port id
-      message, sent_message_port_ids));
-}
-
-void AppWebMessagePortMessageFilter::SendClosePortMessage(int message_port_id) {
-  Send(new AppWebMessagePortMsg_ClosePort(route_id_, message_port_id));
-}
-
-void AppWebMessagePortMessageFilter::SendMessage(
-    int msg_port_route_id,
-    const base::string16& message,
-    const std::vector<int>& sent_message_port_ids) {
-  MessagePortService* msp = MessagePortService::GetInstance();
-  for (int sent_port_id : sent_message_port_ids) {
-    msp->HoldMessages(sent_port_id);
-    msp->UpdateMessagePort(sent_port_id, this, sent_port_id);
-  }
-  Send(new AppWebMessagePortMsg_WebToAppMessage(
-      route_id_,
-      msg_port_route_id,  // same as the port id
-      message, sent_message_port_ids));
-}
-
-void AppWebMessagePortMessageFilter::SendMessagesAreQueued(int route_id) {
-  // TODO(sgurun) implement
-  NOTREACHED();
-}
-
-}  // namespace content
diff --git a/content/browser/android/app_web_message_port_message_filter.h b/content/browser/android/app_web_message_port_message_filter.h
deleted file mode 100644
index b9658eb..0000000
--- a/content/browser/android/app_web_message_port_message_filter.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_MESSAGE_FILTER_H_
-#define CONTENT_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_MESSAGE_FILTER_H_
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "content/public/browser/browser_message_filter.h"
-#include "content/public/browser/message_port_delegate.h"
-
-namespace content {
-
-// Filter for Aw specific MessagePort related IPC messages (creating and
-// destroying a MessagePort, sending a message via a MessagePort etc).
-class AppWebMessagePortMessageFilter : public content::BrowserMessageFilter,
-                                       public content::MessagePortDelegate {
- public:
-  explicit AppWebMessagePortMessageFilter(int route_id);
-
-  // BrowserMessageFilter implementation.
-  void OnChannelClosing() override;
-  bool OnMessageReceived(const IPC::Message& message) override;
-  void OnDestruct() const override;
-
-  void SendAppToWebMessage(int msg_port_route_id,
-                           const base::string16& message,
-                           const std::vector<int>& sent_message_port_ids);
-  void SendClosePortMessage(int message_port_id);
-
-  // MessagePortDelegate implementation.
-  void SendMessage(int msg_port_route_id,
-                   const base::string16& message,
-                   const std::vector<int>& sent_message_ports) override;
-  void SendMessagesAreQueued(int route_id) override;
-
- private:
-  friend class content::BrowserThread;
-  friend class base::DeleteHelper<AppWebMessagePortMessageFilter>;
-
-  void OnConvertedAppToWebMessage(
-      int msg_port_id,
-      const base::string16& message,
-      const std::vector<int>& sent_message_port_ids);
-  void OnClosePortAck(int message_port_id);
-
-  int route_id_;
-
-  ~AppWebMessagePortMessageFilter() override;
-
-  DISALLOW_COPY_AND_ASSIGN(AppWebMessagePortMessageFilter);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_MESSAGE_FILTER_H_
diff --git a/content/browser/android/app_web_message_port_service_impl.cc b/content/browser/android/app_web_message_port_service_impl.cc
deleted file mode 100644
index 94f3d89..0000000
--- a/content/browser/android/app_web_message_port_service_impl.cc
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/android/app_web_message_port_service_impl.h"
-
-#include "base/android/jni_array.h"
-#include "base/android/jni_string.h"
-#include "base/bind.h"
-#include "content/browser/android/app_web_message_port_message_filter.h"
-#include "content/browser/message_port_service.h"
-#include "content/browser/renderer_host/render_process_host_impl.h"
-#include "content/browser/web_contents/web_contents_impl.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/message_port_provider.h"
-#include "jni/AppWebMessagePortService_jni.h"
-
-namespace content {
-
-using base::android::AttachCurrentThread;
-using base::android::ConvertJavaStringToUTF16;
-using base::android::ConvertUTF16ToJavaString;
-using base::android::JavaParamRef;
-using base::android::JavaRef;
-using base::android::ScopedJavaGlobalRef;
-using base::android::ScopedJavaLocalRef;
-using base::android::ToJavaIntArray;
-using content::BrowserThread;
-using content::MessagePortProvider;
-
-AppWebMessagePortServiceImpl* AppWebMessagePortServiceImpl::GetInstance() {
-  return base::Singleton<AppWebMessagePortServiceImpl>::get();
-}
-
-AppWebMessagePortServiceImpl::AppWebMessagePortServiceImpl() {}
-
-AppWebMessagePortServiceImpl::~AppWebMessagePortServiceImpl() {
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
-  if (obj.is_null())
-    return;
-  Java_AppWebMessagePortService_unregisterNativeAppWebMessagePortService(env,
-                                                                         obj);
-}
-
-void AppWebMessagePortServiceImpl::Init(JNIEnv* env, jobject obj) {
-  java_ref_ = JavaObjectWeakGlobalRef(env, obj);
-}
-
-void AppWebMessagePortServiceImpl::CreateMessageChannel(
-    JNIEnv* env,
-    const JavaRef<jobjectArray>& ports,
-    WebContents* web_contents) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  RenderFrameHostImpl* rfh =
-      static_cast<RenderFrameHostImpl*>(web_contents->GetMainFrame());
-  int routing_id = web_contents->GetMainFrame()->GetRoutingID();
-  scoped_refptr<AppWebMessagePortMessageFilter> filter =
-      rfh->GetAppWebMessagePortMessageFilter(routing_id);
-
-  int* portId1 = new int;
-  int* portId2 = new int;
-  BrowserThread::PostTaskAndReply(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(&AppWebMessagePortServiceImpl::CreateMessageChannelOnIOThread,
-                 base::Unretained(this), filter, portId1, portId2),
-      base::Bind(&AppWebMessagePortServiceImpl::OnMessageChannelCreated,
-                 base::Unretained(this),
-                 ScopedJavaGlobalRef<jobjectArray>(ports), base::Owned(portId1),
-                 base::Owned(portId2)));
-}
-
-void AppWebMessagePortServiceImpl::OnConvertedWebToAppMessage(
-    int message_port_id,
-    const base::ListValue& message,
-    const std::vector<int>& sent_message_port_ids) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jobject> jobj = java_ref_.get(env);
-  if (jobj.is_null())
-    return;
-
-  base::string16 value;
-  if (!message.GetString(0, &value)) {
-    LOG(WARNING) << "Converting post message to a string failed for port "
-                 << message_port_id;
-    return;
-  }
-
-  if (message.GetSize() != 1) {
-    NOTREACHED();
-    return;
-  }
-
-  // Add the ports to AppWebMessagePortService.
-  for (const auto& iter : sent_message_port_ids) {
-    AddPort(iter, ports_[message_port_id]);
-  }
-
-  ScopedJavaLocalRef<jstring> jmsg = ConvertUTF16ToJavaString(env, value);
-  ScopedJavaLocalRef<jintArray> jports =
-      ToJavaIntArray(env, sent_message_port_ids);
-  Java_AppWebMessagePortService_onReceivedMessage(env, jobj, message_port_id,
-                                                  jmsg, jports);
-}
-
-void AppWebMessagePortServiceImpl::OnMessagePortMessageFilterClosing(
-    AppWebMessagePortMessageFilter* filter) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  for (MessagePorts::iterator iter = ports_.begin(); iter != ports_.end();) {
-    if (iter->second == filter) {
-      iter = ports_.erase(iter);
-    } else {
-      ++iter;
-    }
-  }
-}
-
-void AppWebMessagePortServiceImpl::PostAppToWebMessage(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    int sender_id,
-    const JavaParamRef<jstring>& message,
-    const JavaParamRef<jintArray>& sent_ports) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  base::string16* j_message = new base::string16;
-  ConvertJavaStringToUTF16(env, message, j_message);
-  std::vector<int>* j_sent_ports = new std::vector<int>;
-  if (sent_ports != nullptr)
-    base::android::JavaIntArrayToIntVector(env, sent_ports, j_sent_ports);
-
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(&AppWebMessagePortServiceImpl::PostAppToWebMessageOnIOThread,
-                 base::Unretained(this), sender_id, base::Owned(j_message),
-                 base::Owned(j_sent_ports)));
-}
-
-// The message port service cannot immediately close the port, because
-// it is possible that messages are still queued in the renderer process
-// waiting for a conversion. Instead, it sends a special message with
-// a flag which indicates that this message port should be closed.
-void AppWebMessagePortServiceImpl::ClosePort(JNIEnv* env,
-                                             const JavaParamRef<jobject>& obj,
-                                             int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(&AppWebMessagePortServiceImpl::PostClosePortMessage,
-                 base::Unretained(this), message_port_id));
-}
-
-void AppWebMessagePortServiceImpl::ReleaseMessages(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(&MessagePortService::ReleaseMessages,
-                 base::Unretained(MessagePortService::GetInstance()),
-                 message_port_id));
-}
-
-void AppWebMessagePortServiceImpl::RemoveSentPorts(
-    const std::vector<int>& sent_ports) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  // Remove the filters that are associated with the transferred ports
-  for (const auto& iter : sent_ports)
-    ports_.erase(iter);
-}
-
-void AppWebMessagePortServiceImpl::PostAppToWebMessageOnIOThread(
-    int sender_id,
-    base::string16* message,
-    std::vector<int>* sent_ports) {
-  RemoveSentPorts(*sent_ports);
-  ports_[sender_id]->SendAppToWebMessage(sender_id, *message, *sent_ports);
-}
-
-void AppWebMessagePortServiceImpl::PostClosePortMessage(int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  ports_[message_port_id]->SendClosePortMessage(message_port_id);
-}
-
-void AppWebMessagePortServiceImpl::CleanupPort(int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  ports_.erase(message_port_id);
-}
-
-void AppWebMessagePortServiceImpl::CreateMessageChannelOnIOThread(
-    scoped_refptr<AppWebMessagePortMessageFilter> filter,
-    int* portId1,
-    int* portId2) {
-  *portId1 = 0;
-  *portId2 = 0;
-  MessagePortService* msp = MessagePortService::GetInstance();
-  msp->Create(MSG_ROUTING_NONE, filter.get(), portId1);
-  msp->Create(MSG_ROUTING_NONE, filter.get(), portId2);
-  // Update the routing number of the message ports to be equal to the message
-  // port numbers.
-  msp->UpdateMessagePort(*portId1, filter.get(), *portId1);
-  msp->UpdateMessagePort(*portId2, filter.get(), *portId2);
-  msp->Entangle(*portId1, *portId2);
-  msp->Entangle(*portId2, *portId1);
-
-  msp->HoldMessages(*portId1);
-  msp->HoldMessages(*portId2);
-  AddPort(*portId1, filter.get());
-  AddPort(*portId2, filter.get());
-}
-
-void AppWebMessagePortServiceImpl::OnMessageChannelCreated(
-    const JavaRef<jobjectArray>& ports,
-    int* port1,
-    int* port2) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  JNIEnv* env = AttachCurrentThread();
-  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
-  if (obj.is_null())
-    return;
-  Java_AppWebMessagePortService_onMessageChannelCreated(env, obj, *port1,
-                                                        *port2, ports);
-}
-
-// Adds a new port to the message port service.
-void AppWebMessagePortServiceImpl::AddPort(
-    int message_port_id,
-    AppWebMessagePortMessageFilter* filter) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-  ports_[message_port_id] = filter;
-}
-
-bool RegisterAppWebMessagePortService(JNIEnv* env) {
-  return RegisterNativesImpl(env);
-}
-
-// static
-jlong InitAppWebMessagePortService(JNIEnv* env,
-                                   const JavaParamRef<jobject>& obj) {
-  AppWebMessagePortServiceImpl* service =
-      AppWebMessagePortServiceImpl::GetInstance();
-  service->Init(env, obj);
-  return reinterpret_cast<intptr_t>(service);
-}
-
-}  // namespace content
diff --git a/content/browser/android/app_web_message_port_service_impl.h b/content/browser/android/app_web_message_port_service_impl.h
deleted file mode 100644
index 84c72ea..0000000
--- a/content/browser/android/app_web_message_port_service_impl.h
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_SERVICE_IMPL_H_
-#define CONTENT_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_SERVICE_IMPL_H_
-
-#include <map>
-
-#include "base/android/jni_weak_ref.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/singleton.h"
-#include "base/strings/string16.h"
-#include "content/public/browser/android/app_web_message_port_service.h"
-
-namespace content {
-class AppWebMessagePortMessageFilter;
-
-// This class is the native peer of AppWebMessagePortService.java.
-// Please see the java class for an explanation of use, ownership and lifetime.
-
-// Threading: Created and initialized on UI thread. For other methods, see
-// the method level DCHECKS or documentation.
-class AppWebMessagePortServiceImpl : public AppWebMessagePortService {
- public:
-  // Returns the AppWebMessagePortServiceImpl singleton.
-  static AppWebMessagePortServiceImpl* GetInstance();
-
-  AppWebMessagePortServiceImpl();
-  ~AppWebMessagePortServiceImpl() override;
-  void Init(JNIEnv* env, jobject object);
-
-  // AppWebMessagePortService implementation
-
-  void CreateMessageChannel(JNIEnv* env,
-                            const base::android::JavaRef<jobjectArray>& ports,
-                            WebContents* web_contents) override;
-  void CleanupPort(int message_port_id) override;
-
-  // Methods called from Java.
-  void PostAppToWebMessage(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& object,
-      int sender_id,
-      const base::android::JavaParamRef<jstring>& message,
-      const base::android::JavaParamRef<jintArray>& sent_ports);
-  void ClosePort(JNIEnv* env,
-                 const base::android::JavaParamRef<jobject>& object,
-                 int message_port_id);
-  void ReleaseMessages(JNIEnv* env,
-                       const base::android::JavaParamRef<jobject>& object,
-                       int message_port_id);
-
-  void OnMessagePortMessageFilterClosing(
-      AppWebMessagePortMessageFilter* filter);
-
-  // AppWebMessagePortServiceImpl specific calls
-  void OnConvertedWebToAppMessage(
-      int message_port_id,
-      const base::ListValue& message,
-      const std::vector<int>& sent_message_port_ids);
-  void RemoveSentPorts(const std::vector<int>& sent_ports);
-
- private:
-  friend struct base::DefaultSingletonTraits<AppWebMessagePortServiceImpl>;
-
-  void PostAppToWebMessageOnIOThread(int sender_id,
-                                     base::string16* message,
-                                     std::vector<int>* sent_ports);
-  void CreateMessageChannelOnIOThread(
-      scoped_refptr<AppWebMessagePortMessageFilter> filter,
-      int* port1,
-      int* port2);
-  void OnMessageChannelCreated(
-      const base::android::JavaRef<jobjectArray>& ports,
-      int* port1,
-      int* port2);
-  void AddPort(int message_port_id, AppWebMessagePortMessageFilter* filter);
-  void PostClosePortMessage(int message_port_id);
-
-  JavaObjectWeakGlobalRef java_ref_;
-  typedef std::map<int, AppWebMessagePortMessageFilter*> MessagePorts;
-  MessagePorts ports_;  // Access on IO thread
-
-  DISALLOW_COPY_AND_ASSIGN(AppWebMessagePortServiceImpl);
-};
-
-bool RegisterAppWebMessagePortService(JNIEnv* env);
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_SERVICE_IMPL_H_
diff --git a/content/browser/android/browser_jni_registrar.cc b/content/browser/android/browser_jni_registrar.cc
index 084ca80f..502643c 100644
--- a/content/browser/android/browser_jni_registrar.cc
+++ b/content/browser/android/browser_jni_registrar.cc
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "content/browser/accessibility/browser_accessibility_android.h"
 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
-#include "content/browser/android/app_web_message_port_service_impl.h"
+#include "content/browser/android/app_web_message_port.h"
 #include "content/browser/android/background_sync_network_observer_android.h"
 #include "content/browser/android/browser_startup_controller.h"
 #include "content/browser/android/child_process_launcher_android.h"
@@ -35,7 +35,7 @@
 
 namespace {
 base::android::RegistrationMethod kContentRegisteredMethods[] = {
-    {"AppWebMessagePortService", content::RegisterAppWebMessagePortService},
+    {"AppWebMessagePort", content::RegisterAppWebMessagePort},
     {"AudioFocusDelegate", content::AudioFocusDelegateAndroid::Register},
     {"BrowserStartupController", content::RegisterBrowserStartupController},
     {"ChildProcessLauncher", content::RegisterChildProcessLauncher},
diff --git a/content/browser/android/string_message_codec.cc b/content/browser/android/string_message_codec.cc
new file mode 100644
index 0000000..aa25887
--- /dev/null
+++ b/content/browser/android/string_message_codec.cc
@@ -0,0 +1,153 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/android/string_message_codec.h"
+
+#include <vector>
+
+#include "base/logging.h"
+
+namespace content {
+namespace {
+
+const uint32_t kVarIntShift = 7;
+const uint32_t kVarIntMask = (1 << kVarIntShift) - 1;
+
+const uint8_t kVersionTag = 0xFF;
+const uint8_t kPaddingTag = '\0';
+const uint8_t kOneByteStringTag = '"';
+const uint8_t kTwoByteStringTag = 'c';
+
+const uint32_t kVersion = 10;
+
+static size_t BytesNeededForUint32(uint32_t value) {
+  size_t result = 0;
+  do {
+    result++;
+    value >>= kVarIntShift;
+  } while (value);
+  return result;
+}
+
+void WriteUint8(uint8_t value, std::vector<uint8_t>* buffer) {
+  buffer->push_back(value);
+}
+
+void WriteUint32(uint32_t value, std::vector<uint8_t>* buffer) {
+  for (;;) {
+    uint8_t b = (value & kVarIntMask);
+    value >>= kVarIntShift;
+    if (!value) {
+      WriteUint8(b, buffer);
+      break;
+    }
+    WriteUint8(b | (1 << kVarIntShift), buffer);
+  }
+}
+
+void WriteBytes(const char* bytes, size_t num_bytes,
+                std::vector<uint8_t>* buffer) {
+  buffer->insert(buffer->end(), bytes, bytes + num_bytes);
+}
+
+bool ReadUint8(const uint8_t** ptr, const uint8_t* end, uint8_t* value) {
+  if (*ptr >= end)
+    return false;
+  *value = *(*ptr)++;
+  return true;
+}
+
+bool ReadUint32(const uint8_t** ptr, const uint8_t* end, uint32_t* value) {
+  *value = 0;
+  uint8_t current_byte;
+  int shift = 0;
+  do {
+    if (*ptr >= end)
+      return false;
+    current_byte = *(*ptr)++;
+    *value |= (static_cast<uint32_t>(current_byte & kVarIntMask) << shift);
+    shift += kVarIntShift;
+  } while (current_byte & (1 << kVarIntShift));
+  return true;
+}
+
+bool ContainsOnlyLatin1(const base::string16& data) {
+  base::char16 x = 0;
+  for (base::char16 c : data)
+    x |= c;
+  return !(x & 0xFF00);
+}
+
+} // namespace
+
+base::string16 EncodeStringMessage(const base::string16& data) {
+  std::vector<uint8_t> buffer;
+  WriteUint8(kVersionTag, &buffer);
+  WriteUint32(kVersion, &buffer);
+
+  if (ContainsOnlyLatin1(data)) {
+    std::string data_latin1(data.begin(), data.end());
+    WriteUint8(kOneByteStringTag, &buffer);
+    WriteUint32(data_latin1.size(), &buffer);
+    WriteBytes(data_latin1.c_str(), data_latin1.size(), &buffer);
+  } else {
+    size_t num_bytes = data.size() * sizeof(base::char16);
+    if ((buffer.size() + 1 + BytesNeededForUint32(num_bytes)) & 1)
+      WriteUint8(kPaddingTag, &buffer);
+    WriteUint8(kTwoByteStringTag, &buffer);
+    WriteUint32(num_bytes, &buffer);
+    WriteBytes(reinterpret_cast<const char*>(data.data()), num_bytes, &buffer);
+  }
+
+  base::string16 result;
+  size_t result_num_bytes = (buffer.size() + 1) & ~1;
+  result.resize(result_num_bytes / 2);
+  uint8_t* destination = reinterpret_cast<uint8_t*>(&result[0]);
+  memcpy(destination, &buffer[0], buffer.size());
+  return result;
+}
+
+bool DecodeStringMessage(const base::string16& encoded_data,
+                         base::string16* result) {
+  size_t num_bytes = encoded_data.size() * 2;
+
+  const uint8_t* ptr = reinterpret_cast<const uint8_t*>(&encoded_data[0]);
+  const uint8_t* end = ptr + num_bytes;
+
+  uint8_t tag;
+  if (!ReadUint8(&ptr, end, &tag) || tag != kVersionTag)
+    return false;
+
+  uint32_t version;
+  if (!ReadUint32(&ptr, end, &version))
+    return false;
+
+  do {
+    if (!ReadUint8(&ptr, end, &tag))
+      return false;
+  } while (tag == kPaddingTag);
+
+  switch (tag) {
+    case kOneByteStringTag: {
+      uint32_t num_bytes;
+      if (!ReadUint32(&ptr, end, &num_bytes))
+        return false;
+      result->assign(reinterpret_cast<const char*>(ptr),
+                     reinterpret_cast<const char*>(ptr) + num_bytes);
+      return true;
+    }
+    case kTwoByteStringTag: {
+      uint32_t num_bytes;
+      if (!ReadUint32(&ptr, end, &num_bytes))
+        return false;
+      result->assign(reinterpret_cast<const base::char16*>(ptr), num_bytes / 2);
+      return true;
+    }
+  }
+
+  DLOG(WARNING) << "Unexpected tag: " << tag;
+  return false;
+}
+
+}  // namespace content
diff --git a/content/browser/android/string_message_codec.h b/content/browser/android/string_message_codec.h
new file mode 100644
index 0000000..94f18c2d
--- /dev/null
+++ b/content/browser/android/string_message_codec.h
@@ -0,0 +1,30 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_ANDROID_STRING_MESSAGE_CODEC_H_
+#define CONTENT_BROWSER_ANDROID_STRING_MESSAGE_CODEC_H_
+
+#include "base/strings/string16.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+// To support exposing HTML message ports to Java, it is necessary to be able
+// to encode and decode message data using the same serialization format as V8.
+// That format is an implementation detail of V8, but we cannot invoke V8 in
+// the browser process. Rather than IPC over to the renderer process to execute
+// the V8 serialization code, we duplicate some of the serialization logic
+// (just for simple string messages) here. This is a trade-off between overall
+// complexity / performance and code duplication. Fortunately, we only need to
+// handle string messages and this serialization format is static, as it is a
+// format we currently persist to disk via IndexedDB.
+
+CONTENT_EXPORT base::string16 EncodeStringMessage(const base::string16& data);
+
+CONTENT_EXPORT bool DecodeStringMessage(const base::string16& encoded_data,
+                                        base::string16* result);
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_ANDROID_STRING_MESSAGE_CODEC_H_
diff --git a/content/browser/android/string_message_codec_unittest.cc b/content/browser/android/string_message_codec_unittest.cc
new file mode 100644
index 0000000..fc3e2c3
--- /dev/null
+++ b/content/browser/android/string_message_codec_unittest.cc
@@ -0,0 +1,146 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/android/string_message_codec.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_async_task_scheduler.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "v8/include/v8.h"
+
+namespace content {
+namespace {
+
+base::string16 DecodeWithV8(const base::string16& encoded) {
+  base::test::ScopedAsyncTaskScheduler task_scheduler;
+  base::string16 result;
+
+  v8::Isolate::CreateParams params;
+  params.array_buffer_allocator =
+      v8::ArrayBuffer::Allocator::NewDefaultAllocator();
+  v8::Isolate* isolate = v8::Isolate::New(params);
+  {
+    v8::HandleScope scope(isolate);
+    v8::TryCatch try_catch(isolate);
+
+    v8::Local<v8::Context> context = v8::Context::New(isolate);
+
+    v8::ValueDeserializer deserializer(
+        isolate,
+        reinterpret_cast<const uint8_t*>(encoded.data()),
+        encoded.size() * sizeof(base::char16));
+    deserializer.SetSupportsLegacyWireFormat(true);
+
+    EXPECT_TRUE(deserializer.ReadHeader(context).ToChecked());
+
+    v8::Local<v8::Value> value =
+        deserializer.ReadValue(context).ToLocalChecked();
+    v8::Local<v8::String> str = value->ToString(context).ToLocalChecked();
+
+    result.resize(str->Length());
+    str->Write(&result[0], 0, result.size());
+  }
+  isolate->Dispose();
+  delete params.array_buffer_allocator;
+
+  return result;
+}
+
+base::string16 EncodeWithV8(const base::string16& message) {
+  base::test::ScopedAsyncTaskScheduler task_scheduler;
+  base::string16 result;
+
+  v8::Isolate::CreateParams params;
+  params.array_buffer_allocator =
+      v8::ArrayBuffer::Allocator::NewDefaultAllocator();
+  v8::Isolate* isolate = v8::Isolate::New(params);
+  {
+    v8::HandleScope scope(isolate);
+    v8::TryCatch try_catch(isolate);
+
+    v8::Local<v8::Context> context = v8::Context::New(isolate);
+
+    v8::Local<v8::String> message_as_value =
+        v8::String::NewFromTwoByte(isolate,
+                                   message.data(),
+                                   v8::NewStringType::kNormal,
+                                   message.size()).ToLocalChecked();
+
+    v8::ValueSerializer serializer(isolate);
+    serializer.WriteHeader();
+    EXPECT_TRUE(serializer.WriteValue(context, message_as_value).ToChecked());
+
+    std::pair<uint8_t*, size_t> buffer = serializer.Release();
+
+    size_t result_num_bytes = (buffer.second + 1) & ~1;
+    result.resize(result_num_bytes / 2);
+    memcpy(reinterpret_cast<uint8_t*>(&result[0]), buffer.first, buffer.second);
+
+    free(buffer.first);
+  }
+  isolate->Dispose();
+  delete params.array_buffer_allocator;
+
+  return result;
+}
+
+TEST(StringMessageCodecTest, SelfTest_ASCII) {
+  base::string16 message = base::ASCIIToUTF16("hello");
+  base::string16 decoded;
+  EXPECT_TRUE(DecodeStringMessage(EncodeStringMessage(message), &decoded));
+  EXPECT_EQ(message, decoded);
+}
+
+TEST(StringMessageCodecTest, SelfTest_NonASCII) {
+  base::string16 message = base::WideToUTF16(L"hello \u263A");
+  base::string16 decoded;
+  EXPECT_TRUE(DecodeStringMessage(EncodeStringMessage(message), &decoded));
+  EXPECT_EQ(message, decoded);
+}
+
+TEST(StringMessageCodecTest, SelfTest_NonASCIILongEnoughToForcePadding) {
+  base::string16 message(200, 0x263A);
+  base::string16 decoded;
+  EXPECT_TRUE(DecodeStringMessage(EncodeStringMessage(message), &decoded));
+  EXPECT_EQ(message, decoded);
+}
+
+TEST(StringMessageCodecTest, SelfToV8Test_ASCII) {
+  base::string16 message = base::ASCIIToUTF16("hello");
+  EXPECT_EQ(message, DecodeWithV8(EncodeStringMessage(message)));
+}
+
+TEST(StringMessageCodecTest, SelfToV8Test_NonASCII) {
+  base::string16 message = base::WideToUTF16(L"hello \u263A");
+  EXPECT_EQ(message, DecodeWithV8(EncodeStringMessage(message)));
+}
+
+TEST(StringMessageCodecTest, SelfToV8Test_NonASCIILongEnoughToForcePadding) {
+  base::string16 message(200, 0x263A);
+  EXPECT_EQ(message, DecodeWithV8(EncodeStringMessage(message)));
+}
+
+TEST(StringMessageCodecTest, V8ToSelfTest_ASCII) {
+  base::string16 message = base::ASCIIToUTF16("hello");
+  base::string16 decoded;
+  EXPECT_TRUE(DecodeStringMessage(EncodeWithV8(message), &decoded));
+  EXPECT_EQ(message, decoded);
+}
+
+TEST(StringMessageCodecTest, V8ToSelfTest_NonASCII) {
+  base::string16 message = base::WideToUTF16(L"hello \u263A");
+  base::string16 decoded;
+  EXPECT_TRUE(DecodeStringMessage(EncodeWithV8(message), &decoded));
+  EXPECT_EQ(message, decoded);
+}
+
+TEST(StringMessageCodecTest, V8ToSelfTest_NonASCIILongEnoughToForcePadding) {
+  base::string16 message(200, 0x263A);
+  base::string16 decoded;
+  EXPECT_TRUE(DecodeStringMessage(EncodeWithV8(message), &decoded));
+  EXPECT_EQ(message, decoded);
+}
+
+}  // namespace
+}  // namespace content
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index cfaddafe..1a48362 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -46,8 +46,8 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "components/discardable_memory/service/discardable_shared_memory_manager.h"
-#include "components/tracing/browser/trace_config_file.h"
 #include "components/tracing/common/process_metrics_memory_dump_provider.h"
+#include "components/tracing/common/trace_config_file.h"
 #include "components/tracing/common/trace_to_console.h"
 #include "components/tracing/common/tracing_switches.h"
 #include "content/browser/audio_manager_thread.h"
diff --git a/content/browser/browser_main_runner.cc b/content/browser/browser_main_runner.cc
index 4865cdb..4b3c19c 100644
--- a/content/browser/browser_main_runner.cc
+++ b/content/browser/browser_main_runner.cc
@@ -11,7 +11,6 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/profiler/scoped_profile.h"
 #include "base/profiler/scoped_tracker.h"
@@ -20,7 +19,7 @@
 #include "base/trace_event/trace_event.h"
 #include "base/tracked_objects.h"
 #include "build/build_config.h"
-#include "components/tracing/browser/trace_config_file.h"
+#include "components/tracing/common/trace_config_file.h"
 #include "components/tracing/common/tracing_switches.h"
 #include "content/browser/browser_main_loop.h"
 #include "content/browser/browser_shutdown_profile_dumper.h"
diff --git a/content/browser/devtools/protocol/tracing_handler.cc b/content/browser/devtools/protocol/tracing_handler.cc
index 4159af13..11a508b 100644
--- a/content/browser/devtools/protocol/tracing_handler.cc
+++ b/content/browser/devtools/protocol/tracing_handler.cc
@@ -17,7 +17,7 @@
 #include "base/trace_event/memory_dump_manager.h"
 #include "base/trace_event/trace_event_impl.h"
 #include "base/trace_event/tracing_agent.h"
-#include "components/tracing/browser/trace_config_file.h"
+#include "components/tracing/common/trace_config_file.h"
 #include "content/browser/devtools/devtools_io_context.h"
 #include "content/browser/devtools/devtools_session.h"
 #include "content/browser/tracing/tracing_controller_impl.h"
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 05bf1397..4a088e0 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -113,7 +113,6 @@
 #include "url/gurl.h"
 
 #if defined(OS_ANDROID)
-#include "content/browser/android/app_web_message_port_message_filter.h"
 #include "content/public/browser/android/java_interfaces.h"
 #include "content/browser/media/android/media_player_renderer.h"
 #include "media/base/audio_renderer_sink.h"
@@ -617,18 +616,6 @@
   return remote_associated_interfaces_.get();
 }
 
-#if defined(OS_ANDROID)
-scoped_refptr<AppWebMessagePortMessageFilter>
-RenderFrameHostImpl::GetAppWebMessagePortMessageFilter(int routing_id) {
-  if (!app_web_message_port_message_filter_) {
-    app_web_message_port_message_filter_ =
-        new AppWebMessagePortMessageFilter(routing_id);
-    GetProcess()->AddFilter(app_web_message_port_message_filter_.get());
-  }
-  return app_web_message_port_message_filter_;
-}
-#endif
-
 blink::WebPageVisibilityState RenderFrameHostImpl::GetVisibilityState() {
   // Works around the crashes seen in https://crbug.com/501863, where the
   // active WebContents from a browser iterator may contain a render frame
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 162ed20..6c11dc61 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -78,7 +78,6 @@
 }
 
 namespace content {
-class AppWebMessagePortMessageFilter;
 class AssociatedInterfaceProviderImpl;
 class CrossProcessFrameConnector;
 class FeaturePolicy;
@@ -313,11 +312,6 @@
 
   GlobalFrameRoutingId GetGlobalFrameRoutingId();
 
-#if defined(OS_ANDROID)
-  scoped_refptr<AppWebMessagePortMessageFilter>
-  GetAppWebMessagePortMessageFilter(int routing_id);
-#endif
-
   // This function is called when this is a swapped out RenderFrameHost that
   // lives in the same process as the parent frame. The
   // |cross_process_frame_connector| allows the non-swapped-out
@@ -1045,12 +1039,6 @@
 
   int on_connect_handler_id_ = 0;
 
-#if defined(OS_ANDROID)
-  // The filter for MessagePort messages between an Android apps and web.
-  scoped_refptr<AppWebMessagePortMessageFilter>
-      app_web_message_port_message_filter_;
-#endif
-
   std::list<std::unique_ptr<WebBluetoothServiceImpl>> web_bluetooth_services_;
 
   // The object managing the accessibility tree for this frame.
diff --git a/content/browser/frame_host/render_frame_proxy_host.cc b/content/browser/frame_host/render_frame_proxy_host.cc
index e0d773b..42cdb39 100644
--- a/content/browser/frame_host/render_frame_proxy_host.cc
+++ b/content/browser/frame_host/render_frame_proxy_host.cc
@@ -14,7 +14,6 @@
 #include "content/browser/frame_host/navigator.h"
 #include "content/browser/frame_host/render_frame_host_delegate.h"
 #include "content/browser/frame_host/render_widget_host_view_child_frame.h"
-#include "content/browser/message_port_message_filter.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/site_instance_impl.h"
@@ -319,26 +318,8 @@
     }
   }
 
-  if (!params.message_ports.empty()) {
-    // Updating the message port information has to be done in the IO thread;
-    // MessagePortMessageFilter::RouteMessageEventWithMessagePorts will send
-    // FrameMsg_PostMessageEvent after it's done. Note that a trivial solution
-    // would've been to post a task on the IO thread to do the IO-thread-bound
-    // work, and make that post a task back to WebContentsImpl in the UI
-    // thread. But we cannot do that, since there's nothing to guarantee that
-    // WebContentsImpl stays alive during the round trip.
-    scoped_refptr<MessagePortMessageFilter> message_port_message_filter(
-        static_cast<RenderProcessHostImpl*>(target_rfh->GetProcess())
-            ->message_port_message_filter());
-    BrowserThread::PostTask(
-        BrowserThread::IO, FROM_HERE,
-        base::Bind(&MessagePortMessageFilter::RouteMessageEventWithMessagePorts,
-                   message_port_message_filter, target_rfh->GetRoutingID(),
-                   new_params));
-  } else {
-    target_rfh->Send(
-        new FrameMsg_PostMessageEvent(target_rfh->GetRoutingID(), new_params));
-  }
+  target_rfh->Send(
+      new FrameMsg_PostMessageEvent(target_rfh->GetRoutingID(), new_params));
 }
 
 void RenderFrameProxyHost::OnDidChangeOpener(int32_t opener_routing_id) {
diff --git a/content/browser/gpu/gpu_data_manager_impl_private.cc b/content/browser/gpu/gpu_data_manager_impl_private.cc
index 83d4acb..8d21371 100644
--- a/content/browser/gpu/gpu_data_manager_impl_private.cc
+++ b/content/browser/gpu/gpu_data_manager_impl_private.cc
@@ -534,11 +534,13 @@
   }
 
   gpu::GPUInfo gpu_info;
-  const bool force_osmesa =
+  const char* softwareGLImplementationName =
+      gl::GetGLImplementationName(gl::GetSoftwareGLImplementation());
+  const bool force_software_gl =
       (command_line->GetSwitchValueASCII(switches::kUseGL) ==
-       gl::kGLImplementationOSMesaName) ||
-      command_line->HasSwitch(switches::kOverrideUseGLWithOSMesaForTests);
-  if (force_osmesa) {
+       softwareGLImplementationName) ||
+      command_line->HasSwitch(switches::kOverrideUseSoftwareGLForTests);
+  if (force_software_gl) {
     // If using the OSMesa GL implementation, use fake vendor and device ids to
     // make sure it never gets blacklisted. This is better than simply
     // cancelling GPUInfo gathering as it allows us to proceed with loading the
@@ -547,9 +549,10 @@
     gpu_info.gpu.vendor_id = 0xffff;
     gpu_info.gpu.device_id = 0xffff;
 
-    // Also declare the driver_vendor to be osmesa to be able to specify
-    // exceptions based on driver_vendor==osmesa for some blacklist rules.
-    gpu_info.driver_vendor = gl::kGLImplementationOSMesaName;
+    // Also declare the driver_vendor to be <software GL> to be able to
+    // specify exceptions based on driver_vendor==<software GL> for some
+    // blacklist rules.
+    gpu_info.driver_vendor = softwareGLImplementationName;
 
     // We are not going to call CollectBasicGraphicsInfo.
     // So mark it as collected.
@@ -594,12 +597,12 @@
 
   std::string gpu_blacklist_string;
   std::string gpu_driver_bug_list_string;
-  if (!force_osmesa &&
+  if (!force_software_gl &&
       !command_line->HasSwitch(switches::kIgnoreGpuBlacklist) &&
       !command_line->HasSwitch(switches::kUseGpuInTests)) {
     gpu_blacklist_string = gpu::kSoftwareRenderingListJson;
   }
-  if (!force_osmesa &&
+  if (!force_software_gl &&
       !command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds)) {
     gpu_driver_bug_list_string = gpu::kGpuDriverBugListJson;
   }
@@ -740,8 +743,9 @@
               IsFeatureBlacklisted(
                   gpu::GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS)) &&
              (use_gl == "any")) {
-    command_line->AppendSwitchASCII(switches::kUseGL,
-                                    gl::kGLImplementationOSMesaName);
+    command_line->AppendSwitchASCII(
+        switches::kUseGL,
+        gl::GetGLImplementationName(gl::GetSoftwareGLImplementation()));
   } else if (!use_gl.empty()) {
     command_line->AppendSwitchASCII(switches::kUseGL, use_gl);
   }
diff --git a/content/browser/message_port_message_filter.cc b/content/browser/message_port_message_filter.cc
deleted file mode 100644
index 3aec44a..0000000
--- a/content/browser/message_port_message_filter.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/message_port_message_filter.h"
-
-#include <stddef.h>
-
-#include "content/browser/message_port_service.h"
-#include "content/common/frame_messages.h"
-#include "content/common/message_port_messages.h"
-
-namespace content {
-
-MessagePortMessageFilter::MessagePortMessageFilter(
-    const NextRoutingIDCallback& callback)
-    : BrowserMessageFilter(MessagePortMsgStart),
-      next_routing_id_(callback) {
-}
-
-MessagePortMessageFilter::~MessagePortMessageFilter() {
-}
-
-void MessagePortMessageFilter::OnChannelClosing() {
-  MessagePortService::GetInstance()->OnMessagePortDelegateClosing(this);
-}
-
-bool MessagePortMessageFilter::OnMessageReceived(const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(MessagePortMessageFilter, message)
-    IPC_MESSAGE_HANDLER(MessagePortHostMsg_CreateMessagePort,
-                        OnCreateMessagePort)
-    IPC_MESSAGE_FORWARD(MessagePortHostMsg_DestroyMessagePort,
-                        MessagePortService::GetInstance(),
-                        MessagePortService::Destroy)
-    IPC_MESSAGE_FORWARD(MessagePortHostMsg_Entangle,
-                        MessagePortService::GetInstance(),
-                        MessagePortService::Entangle)
-    IPC_MESSAGE_FORWARD(MessagePortHostMsg_PostMessage,
-                        MessagePortService::GetInstance(),
-                        MessagePortService::PostMessage)
-    IPC_MESSAGE_FORWARD(MessagePortHostMsg_QueueMessages,
-                        MessagePortService::GetInstance(),
-                        MessagePortService::QueueMessages)
-    IPC_MESSAGE_FORWARD(MessagePortHostMsg_SendQueuedMessages,
-                        MessagePortService::GetInstance(),
-                        MessagePortService::SendQueuedMessages)
-    IPC_MESSAGE_FORWARD(MessagePortHostMsg_ReleaseMessages,
-                        MessagePortService::GetInstance(),
-                        MessagePortService::ReleaseMessages)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-
-  return handled;
-}
-
-void MessagePortMessageFilter::OnDestruct() const {
-  BrowserThread::DeleteOnIOThread::Destruct(this);
-}
-
-int MessagePortMessageFilter::GetNextRoutingID() {
-  return next_routing_id_.Run();
-}
-
-void MessagePortMessageFilter::SendMessage(
-    int route_id,
-    const base::string16& message,
-    const std::vector<int>& sent_message_ports) {
-  // Generate new routing ids for all ports that were sent around. This avoids
-  // waiting for the created ports to send a sync message back to get routing
-  // ids.
-  std::vector<int> new_routing_ids;
-  UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids);
-  Send(new MessagePortMsg_Message(route_id, message, sent_message_ports,
-                                  new_routing_ids));
-}
-
-void MessagePortMessageFilter::SendMessagesAreQueued(int route_id) {
-  Send(new MessagePortMsg_MessagesQueued(route_id));
-}
-
-void MessagePortMessageFilter::UpdateMessagePortsWithNewRoutes(
-    const std::vector<int>& message_ports,
-    std::vector<int>* new_routing_ids) {
-  DCHECK(new_routing_ids);
-  new_routing_ids->clear();
-  new_routing_ids->resize(message_ports.size());
-
-  for (size_t i = 0; i < message_ports.size(); ++i) {
-    (*new_routing_ids)[i] = GetNextRoutingID();
-    MessagePortService::GetInstance()->UpdateMessagePort(
-        message_ports[i],
-        this,
-        (*new_routing_ids)[i]);
-  }
-}
-
-void MessagePortMessageFilter::RouteMessageEventWithMessagePorts(
-    int routing_id,
-    const FrameMsg_PostMessage_Params& params) {
-  FrameMsg_PostMessage_Params new_params(params);
-  UpdateMessagePortsWithNewRoutes(params.message_ports,
-                                  &new_params.new_routing_ids);
-  Send(new FrameMsg_PostMessageEvent(routing_id, new_params));
-}
-
-void MessagePortMessageFilter::OnCreateMessagePort(int *route_id,
-                                                   int* message_port_id) {
-  *route_id = next_routing_id_.Run();
-  MessagePortService::GetInstance()->Create(*route_id, this, message_port_id);
-}
-
-}  // namespace content
diff --git a/content/browser/message_port_message_filter.h b/content/browser/message_port_message_filter.h
deleted file mode 100644
index 7edc9411..0000000
--- a/content/browser/message_port_message_filter.h
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_MESSAGE_PORT_MESSAGE_FILTER_H_
-#define CONTENT_BROWSER_MESSAGE_PORT_MESSAGE_FILTER_H_
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "content/common/content_export.h"
-#include "content/public/browser/browser_message_filter.h"
-#include "content/public/browser/message_port_delegate.h"
-
-// Windows headers will redefine SendMessage.
-#ifdef SendMessage
-#undef SendMessage
-#endif
-
-struct FrameMsg_PostMessage_Params;
-
-namespace content {
-
-// Filter for MessagePort related IPC messages (creating and destroying a
-// MessagePort, sending a message via a MessagePort etc).
-class CONTENT_EXPORT MessagePortMessageFilter
-    : public MessagePortDelegate,
-      public BrowserMessageFilter {
- public:
-  typedef base::Callback<int(void)> NextRoutingIDCallback;
-
-  // |next_routing_id| is owned by this object.  It can be used up until
-  // OnChannelClosing.
-  explicit MessagePortMessageFilter(const NextRoutingIDCallback& callback);
-
-  // BrowserMessageFilter implementation.
-  void OnChannelClosing() override;
-  bool OnMessageReceived(const IPC::Message& message) override;
-  void OnDestruct() const override;
-
-  int GetNextRoutingID();
-
-  // MessagePortDelegate implementation.
-  void SendMessage(
-      int route_id,
-      const base::string16& message,
-      const std::vector<int>& sent_message_ports) override;
-  void SendMessagesAreQueued(int route_id) override;
-
-  // Updates message ports registered for |message_ports| and returns
-  // new routing IDs for the updated ports via |new_routing_ids|.
-  void UpdateMessagePortsWithNewRoutes(
-      const std::vector<int>& message_ports,
-      std::vector<int>* new_routing_ids);
-
-  void RouteMessageEventWithMessagePorts(
-      int routing_id,
-      const FrameMsg_PostMessage_Params& params);
-
- protected:
-  // This is protected, so we can define sub classes for testing.
-  ~MessagePortMessageFilter() override;
-
- private:
-  friend class BrowserThread;
-  friend class base::DeleteHelper<MessagePortMessageFilter>;
-
-  // Message handlers.
-  void OnCreateMessagePort(int* route_id, int* message_port_id);
-
-  // This is guaranteed to be valid until OnChannelClosing is invoked, and it's
-  // not used after.
-  NextRoutingIDCallback next_routing_id_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(MessagePortMessageFilter);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_MESSAGE_PORT_MESSAGE_FILTER_H_
diff --git a/content/browser/message_port_provider.cc b/content/browser/message_port_provider.cc
index aa6ae956..d01696c4 100644
--- a/content/browser/message_port_provider.cc
+++ b/content/browser/message_port_provider.cc
@@ -5,57 +5,74 @@
 #include "content/public/browser/message_port_provider.h"
 
 #include "content/browser/browser_thread_impl.h"
-#include "content/browser/message_port_message_filter.h"
-#include "content/browser/message_port_service.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/common/frame_messages.h"
-#include "content/public/browser/message_port_delegate.h"
 
 #if defined(OS_ANDROID)
-#include "content/browser/android/app_web_message_port_service_impl.h"
+#include "base/android/jni_string.h"
+#include "content/browser/android/app_web_message_port.h"
 #endif
 
 namespace content {
+namespace {
 
-// static
-void MessagePortProvider::PostMessageToFrame(
+void PostMessageToFrameInternal(
     WebContents* web_contents,
     const base::string16& source_origin,
     const base::string16& target_origin,
     const base::string16& data,
-    const std::vector<int>& ports) {
+    std::vector<MessagePort> ports) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-#if defined(OS_ANDROID)
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(&content::AppWebMessagePortServiceImpl::RemoveSentPorts,
-                 base::Unretained(AppWebMessagePortServiceImpl::GetInstance()),
-                 ports));
-#endif
   FrameMsg_PostMessage_Params params;
   params.is_data_raw_string = true;
   params.data = data;
   params.source_routing_id = MSG_ROUTING_NONE;
   params.source_origin = source_origin;
   params.target_origin = target_origin;
-  params.message_ports = ports;
+  params.message_ports = std::move(ports);
 
-  RenderProcessHostImpl* rph =
-      static_cast<RenderProcessHostImpl*>(web_contents->GetRenderProcessHost());
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::Bind(&MessagePortMessageFilter::RouteMessageEventWithMessagePorts,
-                 rph->message_port_message_filter(),
-                 web_contents->GetMainFrame()->GetRoutingID(), params));
+  RenderFrameHost* rfh = web_contents->GetMainFrame();
+  rfh->Send(new FrameMsg_PostMessageEvent(rfh->GetRoutingID(), params));
 }
 
 #if defined(OS_ANDROID)
+base::string16 ToString16(JNIEnv* env,
+                          const base::android::JavaParamRef<jstring>& s) {
+  if (s.is_null())
+    return base::string16();
+  return base::android::ConvertJavaStringToUTF16(env, s);
+}
+#endif
+
+}  // namespace
+
 // static
-AppWebMessagePortService* MessagePortProvider::GetAppWebMessagePortService() {
-  return AppWebMessagePortServiceImpl::GetInstance();
+void MessagePortProvider::PostMessageToFrame(
+    WebContents* web_contents,
+    const base::string16& source_origin,
+    const base::string16& target_origin,
+    const base::string16& data) {
+  PostMessageToFrameInternal(web_contents, source_origin, target_origin, data,
+                             std::vector<MessagePort>());
+}
+
+#if defined(OS_ANDROID)
+void MessagePortProvider::PostMessageToFrame(
+    WebContents* web_contents,
+    JNIEnv* env,
+    const base::android::JavaParamRef<jstring>& source_origin,
+    const base::android::JavaParamRef<jstring>& target_origin,
+    const base::android::JavaParamRef<jstring>& data,
+    const base::android::JavaParamRef<jobjectArray>& ports) {
+  PostMessageToFrameInternal(
+      web_contents,
+      ToString16(env, source_origin),
+      ToString16(env, target_origin),
+      ToString16(env, data),
+      AppWebMessagePort::UnwrapJavaArray(env, ports));
 }
 #endif
 
diff --git a/content/browser/message_port_provider_browsertest.cc b/content/browser/message_port_provider_browsertest.cc
index 6e7f895..4fc5caf 100644
--- a/content/browser/message_port_provider_browsertest.cc
+++ b/content/browser/message_port_provider_browsertest.cc
@@ -6,9 +6,8 @@
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
-#include "content/browser/message_port_service.h"
+#include "content/common/message_port.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/message_port_delegate.h"
 #include "content/public/browser/message_port_provider.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test_utils.h"
@@ -20,45 +19,6 @@
 
 // This test verifies the functionality of the Message Port Provider API.
 
-// A mock class for testing message port provider.
-class MockMessagePortDelegate : public MessagePortDelegate {
- public:
-  // A container to hold received messages
-  struct Message {
-    int route_id;  // the routing id of the target port
-    base::string16 data;  // the message data
-    std::vector<int> sent_ports;  // any transferred ports
-  };
-
-  typedef std::vector<Message> Messages;
-
-  MockMessagePortDelegate() { }
-  ~MockMessagePortDelegate() override { }
-
-  // MessagePortDelegate implementation
-  void SendMessage(
-      int route_id,
-      const base::string16& message,
-      const std::vector<int>& sent_message_ports) override {
-    Message m;
-    m.route_id = route_id;
-    m.data = message;
-    m.sent_ports = sent_message_ports;
-    messages_.push_back(m);
-  }
-
-  void SendMessagesAreQueued(int route_id) override { }
-
-  const Messages& getReceivedMessages() {
-    return messages_;
-  }
- private:
-  Messages messages_;
-
-  DISALLOW_COPY_AND_ASSIGN(MockMessagePortDelegate);
-};
-
-
 class MessagePortProviderBrowserTest : public ContentBrowserTest {
 };
 
@@ -77,13 +37,11 @@
   content::LoadDataWithBaseURL(shell(), history_url, data, base_url);
   const base::string16 source_origin(base::UTF8ToUTF16("source"));
   const base::string16 message(base::UTF8ToUTF16("success"));
-  const std::vector<int> ports;
   content::TitleWatcher title_watcher(shell()->web_contents(), message);
   MessagePortProvider::PostMessageToFrame(shell()->web_contents(),
                                           source_origin,
                                           target_origin,
-                                          message,
-                                          ports);
+                                          message);
   EXPECT_EQ(message, title_watcher.WaitAndGetTitle());
 }
 
diff --git a/content/browser/message_port_service.cc b/content/browser/message_port_service.cc
deleted file mode 100644
index d0e1c1f..0000000
--- a/content/browser/message_port_service.cc
+++ /dev/null
@@ -1,347 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/message_port_service.h"
-
-#include <stddef.h>
-
-#include "content/common/message_port_messages.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/message_port_delegate.h"
-
-namespace content {
-
-struct MessagePortService::MessagePort {
-  // |delegate| and |route_id| are what we need to send messages to the port.
-  // |delegate| is just a raw pointer since it notifies us by calling
-  // OnMessagePortDelegateClosing before it gets destroyed.
-  MessagePortDelegate* delegate;
-  int route_id;
-  // A globally unique id for this message port.
-  int message_port_id;
-  // The globally unique id of the entangled message port.
-  int entangled_message_port_id;
-  // If true, all messages to this message port are queued and not delivered.
-  // This is needed so that when a message port is sent between processes all
-  // pending message get transferred. There are two possibilities for pending
-  // messages: either they are already received by the child process, or they're
-  // in-flight. This flag ensures that the latter type get flushed through the
-  // system.
-  // This flag should only be set to true in response to
-  // MessagePortHostMsg_QueueMessages.
-  bool queue_for_inflight_messages;
-  // If true, all messages to this message port are queued and not delivered.
-  // This is needed so that when a message port is sent to a new process all
-  // messages are held in the browser process until the destination process is
-  // ready to receive messages. This flag is set true when a message port is
-  // transferred to a different process but there isn't immediately a
-  // MessagePortDelegate available for that new process. Once the
-  // destination process is ready to receive messages it sends
-  // MessagePortHostMsg_ReleaseMessages to set this flag to false.
-  bool hold_messages_for_destination;
-  // Returns true if messages should be queued for either reason.
-  bool queue_messages() const {
-    return queue_for_inflight_messages || hold_messages_for_destination;
-  }
-  // If true, the message port should be destroyed but was currently still
-  // waiting for a SendQueuedMessages message from a renderer. As soon as that
-  // message is received the port will actually be destroyed.
-  bool should_be_destroyed;
-  QueuedMessages queued_messages;
-};
-
-MessagePortService* MessagePortService::GetInstance() {
-  return base::Singleton<MessagePortService>::get();
-}
-
-MessagePortService::MessagePortService()
-    : next_message_port_id_(0) {
-}
-
-MessagePortService::~MessagePortService() {
-}
-
-void MessagePortService::UpdateMessagePort(int message_port_id,
-                                           MessagePortDelegate* delegate,
-                                           int routing_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  MessagePort& port = message_ports_[message_port_id];
-  port.delegate = delegate;
-  port.route_id = routing_id;
-}
-
-void MessagePortService::GetMessagePortInfo(int message_port_id,
-                                            MessagePortDelegate** delegate,
-                                            int* routing_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  const MessagePort& port = message_ports_[message_port_id];
-  if (delegate)
-    *delegate = port.delegate;
-  if (routing_id)
-    *routing_id = port.route_id;
-}
-
-void MessagePortService::OnMessagePortDelegateClosing(
-    MessagePortDelegate* delegate) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  // Check if the (possibly) crashed process had any message ports.
-  for (MessagePorts::iterator iter = message_ports_.begin();
-       iter != message_ports_.end();) {
-    MessagePorts::iterator cur_item = iter++;
-    if (cur_item->second.delegate == delegate) {
-      Erase(cur_item->first);
-    }
-  }
-}
-
-void MessagePortService::Create(int route_id,
-                                MessagePortDelegate* delegate,
-                                int* message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  *message_port_id = ++next_message_port_id_;
-
-  MessagePort port;
-  port.delegate = delegate;
-  port.route_id = route_id;
-  port.message_port_id = *message_port_id;
-  port.entangled_message_port_id = MSG_ROUTING_NONE;
-  port.queue_for_inflight_messages = false;
-  port.hold_messages_for_destination = false;
-  port.should_be_destroyed = false;
-  message_ports_[*message_port_id] = port;
-}
-
-void MessagePortService::Destroy(int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  DCHECK(message_ports_[message_port_id].queued_messages.empty());
-
-  Erase(message_port_id);
-}
-
-void MessagePortService::Entangle(int local_message_port_id,
-                                  int remote_message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(local_message_port_id) ||
-      !message_ports_.count(remote_message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  DCHECK(message_ports_[remote_message_port_id].entangled_message_port_id ==
-      MSG_ROUTING_NONE);
-  message_ports_[remote_message_port_id].entangled_message_port_id =
-      local_message_port_id;
-}
-
-void MessagePortService::PostMessage(
-    int sender_message_port_id,
-    const base::string16& message,
-    const std::vector<int>& sent_message_ports) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(sender_message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  int entangled_message_port_id =
-      message_ports_[sender_message_port_id].entangled_message_port_id;
-  if (entangled_message_port_id == MSG_ROUTING_NONE)
-    return;  // Process could have crashed.
-
-  if (!message_ports_.count(entangled_message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  PostMessageTo(entangled_message_port_id, message, sent_message_ports);
-}
-
-void MessagePortService::PostMessageTo(
-    int message_port_id,
-    const base::string16& message,
-    const std::vector<int>& sent_message_ports) {
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-  for (size_t i = 0; i < sent_message_ports.size(); ++i) {
-    if (!message_ports_.count(sent_message_ports[i])) {
-      NOTREACHED();
-      return;
-    }
-  }
-
-  MessagePort& entangled_port = message_ports_[message_port_id];
-  if (entangled_port.queue_messages()) {
-    // If the target port is currently holding messages because the destination
-    // renderer isn't available yet, all message ports being sent should also be
-    // put in this state.
-    if (entangled_port.hold_messages_for_destination) {
-      for (const auto& port : sent_message_ports)
-        HoldMessages(port);
-    }
-    entangled_port.queued_messages.push_back(
-        std::make_pair(message, sent_message_ports));
-    return;
-  }
-
-  if (!entangled_port.delegate) {
-    NOTREACHED();
-    return;
-  }
-
-  // Now send the message to the entangled port.
-  entangled_port.delegate->SendMessage(entangled_port.route_id, message,
-                                       sent_message_ports);
-}
-
-void MessagePortService::QueueMessages(int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  MessagePort& port = message_ports_[message_port_id];
-  if (port.delegate) {
-    port.delegate->SendMessagesAreQueued(port.route_id);
-    port.queue_for_inflight_messages = true;
-    port.delegate = NULL;
-  }
-}
-
-void MessagePortService::SendQueuedMessages(
-    int message_port_id,
-    const QueuedMessages& queued_messages) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  // Send the queued messages to the port again.  This time they'll reach the
-  // new location.
-  MessagePort& port = message_ports_[message_port_id];
-  port.queue_for_inflight_messages = false;
-
-  // If the port is currently holding messages waiting for the target renderer,
-  // all ports in messages being sent to the port should also be put on hold.
-  if (port.hold_messages_for_destination) {
-    for (const auto& message : queued_messages)
-      for (int sent_port : message.second)
-        HoldMessages(sent_port);
-  }
-
-  port.queued_messages.insert(port.queued_messages.begin(),
-                              queued_messages.begin(),
-                              queued_messages.end());
-
-  if (port.should_be_destroyed)
-    ClosePort(message_port_id);
-  else
-    SendQueuedMessagesIfPossible(message_port_id);
-}
-
-void MessagePortService::SendQueuedMessagesIfPossible(int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  MessagePort& port = message_ports_[message_port_id];
-  if (port.queue_messages() || !port.delegate)
-    return;
-
-  for (QueuedMessages::iterator iter = port.queued_messages.begin();
-       iter != port.queued_messages.end(); ++iter) {
-    PostMessageTo(message_port_id, iter->first, iter->second);
-  }
-  port.queued_messages.clear();
-}
-
-void MessagePortService::HoldMessages(int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  // Any ports in messages currently in the queue should also be put on hold.
-  for (const auto& message : message_ports_[message_port_id].queued_messages)
-    for (int sent_port : message.second)
-      HoldMessages(sent_port);
-
-  message_ports_[message_port_id].hold_messages_for_destination = true;
-}
-
-bool MessagePortService::AreMessagesHeld(int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id))
-    return false;
-  return message_ports_[message_port_id].hold_messages_for_destination;
-}
-
-void MessagePortService::ClosePort(int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  if (message_ports_[message_port_id].queue_for_inflight_messages) {
-    message_ports_[message_port_id].should_be_destroyed = true;
-    return;
-  }
-
-  // First close any message ports in the queue for this message port.
-  for (const auto& message : message_ports_[message_port_id].queued_messages)
-    for (int sent_port : message.second)
-      ClosePort(sent_port);
-
-  Erase(message_port_id);
-}
-
-void MessagePortService::ReleaseMessages(int message_port_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  if (!message_ports_.count(message_port_id)) {
-    NOTREACHED();
-    return;
-  }
-
-  message_ports_[message_port_id].hold_messages_for_destination = false;
-  SendQueuedMessagesIfPossible(message_port_id);
-}
-
-void MessagePortService::Erase(int message_port_id) {
-  MessagePorts::iterator erase_item = message_ports_.find(message_port_id);
-  DCHECK(erase_item != message_ports_.end());
-
-  int entangled_id = erase_item->second.entangled_message_port_id;
-  if (entangled_id != MSG_ROUTING_NONE) {
-    // Do the disentanglement (and be paranoid about the other side existing
-    // just in case something unusual happened during entanglement).
-    if (message_ports_.count(entangled_id)) {
-      message_ports_[entangled_id].entangled_message_port_id = MSG_ROUTING_NONE;
-    }
-  }
-  message_ports_.erase(erase_item);
-}
-
-}  // namespace content
diff --git a/content/browser/message_port_service.h b/content/browser/message_port_service.h
deleted file mode 100644
index e53846d..0000000
--- a/content/browser/message_port_service.h
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_MESSAGE_PORT_SERVICE_H_
-#define CONTENT_BROWSER_MESSAGE_PORT_SERVICE_H_
-
-#include <map>
-#include <utility>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/singleton.h"
-#include "base/strings/string16.h"
-#include "content/common/content_export.h"
-#include "ipc/ipc_message.h"
-
-namespace content {
-class MessagePortDelegate;
-
-class CONTENT_EXPORT MessagePortService {
- public:
-  typedef std::vector<std::pair<base::string16, std::vector<int>>>
-      QueuedMessages;
-
-  // Returns the MessagePortService singleton.
-  static MessagePortService* GetInstance();
-
-  // These methods correspond to the message port related IPCs.
-  void Create(int route_id,
-              MessagePortDelegate* delegate,
-              int* message_port_id);
-  void Destroy(int message_port_id);
-  void Entangle(int local_message_port_id, int remote_message_port_id);
-  void PostMessage(
-      int sender_message_port_id,
-      const base::string16& message,
-      const std::vector<int>& sent_message_ports);
-  void QueueMessages(int message_port_id);
-  void SendQueuedMessages(int message_port_id,
-                          const QueuedMessages& queued_messages);
-  void ReleaseMessages(int message_port_id);
-
-  // Updates the information needed to reach a message port when it's sent to a
-  // (possibly different) process.
-  void UpdateMessagePort(int message_port_id,
-                         MessagePortDelegate* delegate,
-                         int routing_id);
-
-  // Returns the current information by which a message port can be reached.
-  // Either |delegate| or |routing_id| can be null, in which case that bit of
-  // information is not returned.
-  void GetMessagePortInfo(int message_port_id,
-                          MessagePortDelegate** delegate,
-                          int* routing_id);
-
-  // The message port is being transferred to a new renderer process, but the
-  // code doing that isn't able to immediately update the message port with a
-  // new filter and routing_id. This queues up all messages sent to this port
-  // until later ReleaseMessages is called for this port (this will happen
-  // automatically as soon as a WebMessagePortChannelImpl instance is created
-  // for this port in the renderer. The browser side code is still responsible
-  // for updating the port with a new filter before that happens. If ultimately
-  // transfering the port to a new process fails, ClosePort should be called to
-  // clean up the port.
-  void HoldMessages(int message_port_id);
-
-  // Returns true if messages for a message port are on hold.
-  bool AreMessagesHeld(int message_port_id);
-
-  // Closes and cleans up the message port.
-  void ClosePort(int message_port_id);
-
-  void OnMessagePortDelegateClosing(MessagePortDelegate* filter);
-
-  // Attempts to send the queued messages for a message port.
-  void SendQueuedMessagesIfPossible(int message_port_id);
-
- private:
-  friend struct base::DefaultSingletonTraits<MessagePortService>;
-
-  MessagePortService();
-  ~MessagePortService();
-
-  void PostMessageTo(
-      int message_port_id,
-      const base::string16& message,
-      const std::vector<int>& sent_message_ports);
-
-  // Handles the details of removing a message port id. Before calling this,
-  // verify that the message port id exists.
-  void Erase(int message_port_id);
-
-  struct MessagePort;
-  typedef std::map<int, MessagePort> MessagePorts;
-  MessagePorts message_ports_;
-
-  // We need globally unique identifiers for each message port.
-  int next_message_port_id_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePortService);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_MESSAGE_PORT_SERVICE_H_
diff --git a/content/browser/renderer_host/media/audio_output_authorization_handler.cc b/content/browser/renderer_host/media/audio_output_authorization_handler.cc
index 3ed7c30..cd9f959 100644
--- a/content/browser/renderer_host/media/audio_output_authorization_handler.cc
+++ b/content/browser/renderer_host/media/audio_output_authorization_handler.cc
@@ -10,7 +10,6 @@
 #include "content/browser/renderer_host/media/audio_input_device_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/media_device_id.h"
-#include "media/audio/audio_system.h"
 #include "media/base/limits.h"
 
 namespace {
@@ -35,16 +34,26 @@
              : media::AudioParameters::UnavailableDeviceParams();
 }
 
+media::AudioParameters GetDeviceParametersOnDeviceThread(
+    media::AudioManager* audio_manager,
+    const std::string& unique_id) {
+  DCHECK(audio_manager->GetTaskRunner()->BelongsToCurrentThread());
+
+  return media::AudioDeviceDescription::IsDefaultDevice(unique_id)
+             ? audio_manager->GetDefaultOutputStreamParameters()
+             : audio_manager->GetOutputStreamParameters(unique_id);
+}
+
 }  // namespace
 
 namespace content {
 
 AudioOutputAuthorizationHandler::AudioOutputAuthorizationHandler(
-    media::AudioSystem* audio_system,
+    media::AudioManager* audio_manager,
     MediaStreamManager* media_stream_manager,
     int render_process_id,
     const std::string& salt)
-    : audio_system_(audio_system),
+    : audio_manager_(audio_manager),
       media_stream_manager_(media_stream_manager),
       permission_checker_(base::MakeUnique<MediaDevicesPermissionChecker>()),
       render_process_id_(render_process_id),
@@ -182,8 +191,18 @@
     const std::string& raw_device_id) const {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   DCHECK(!raw_device_id.empty());
-  audio_system_->GetOutputStreamParameters(
-      raw_device_id,
+  base::PostTaskAndReplyWithResult(
+      // Note: In the case of a shutdown, the task to delete |audio_manager_| is
+      // posted to the audio thread after the IO thread is stopped, so the task
+      // to delete the audio manager hasn't been posted yet. This means that
+      // unretained is safe here.
+      // Mac is a special case. Since the audio manager lives on the UI thread
+      // on Mac, this task is posted to the UI thread, but tasks posted to the
+      // UI task runner will be ignored when the shutdown has progressed to
+      // deleting the audio manager, so this is still safe.
+      audio_manager_->GetTaskRunner(), FROM_HERE,
+      base::Bind(&GetDeviceParametersOnDeviceThread,
+                 base::Unretained(audio_manager_), raw_device_id),
       base::Bind(&AudioOutputAuthorizationHandler::DeviceParametersReceived,
                  weak_factory_.GetWeakPtr(), std::move(cb), false,
                  raw_device_id));
diff --git a/content/browser/renderer_host/media/audio_output_authorization_handler.h b/content/browser/renderer_host/media/audio_output_authorization_handler.h
index d7c99fb5..c0b5640 100644
--- a/content/browser/renderer_host/media/audio_output_authorization_handler.h
+++ b/content/browser/renderer_host/media/audio_output_authorization_handler.h
@@ -14,13 +14,10 @@
 #include "content/browser/media/media_devices_permission_checker.h"
 #include "content/browser/renderer_host/media/media_stream_manager.h"
 #include "media/audio/audio_device_description.h"
+#include "media/audio/audio_manager.h"
 #include "media/base/audio_parameters.h"
 #include "media/base/output_device_info.h"
 
-namespace media {
-class AudioSystem;
-}
-
 namespace content {
 
 // This class, which lives on the IO thread, handles the logic of an IPC device
@@ -43,7 +40,7 @@
                           const media::AudioParameters& params,
                           const std::string& raw_device_id)>;
 
-  AudioOutputAuthorizationHandler(media::AudioSystem* audio_system,
+  AudioOutputAuthorizationHandler(media::AudioManager* audio_manager,
                                   MediaStreamManager* media_stream_manager,
                                   int render_process_id_,
                                   const std::string& salt);
@@ -87,7 +84,7 @@
       const std::string& raw_device_id,
       const media::AudioParameters& output_params) const;
 
-  media::AudioSystem* audio_system_;
+  media::AudioManager* audio_manager_;
   MediaStreamManager* const media_stream_manager_;
   std::unique_ptr<MediaDevicesPermissionChecker> permission_checker_;
   const int render_process_id_;
diff --git a/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc b/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc
index 4e34099..f82855a 100644
--- a/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc
+++ b/content/browser/renderer_host/media/audio_output_authorization_handler_unittest.cc
@@ -18,7 +18,6 @@
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "media/audio/audio_device_description.h"
-#include "media/audio/audio_system_impl.h"
 #include "media/audio/fake_audio_log_factory.h"
 #include "media/audio/fake_audio_manager.h"
 #include "media/base/media_switches.h"
@@ -67,7 +66,6 @@
     audio_manager_.reset(new media::FakeAudioManager(
         audio_thread_->task_runner(), audio_thread_->worker_task_runner(),
         &log_factory_));
-    audio_system_ = media::AudioSystemImpl::Create(audio_manager_.get());
     media_stream_manager_ =
         base::MakeUnique<MediaStreamManager>(audio_manager_.get());
     // Make sure everything is done initializing:
@@ -81,7 +79,7 @@
     return media_stream_manager_.get();
   }
 
-  media::AudioSystem* GetAudioSystem() { return audio_system_.get(); }
+  media::AudioManager* GetAudioManager() { return audio_manager_.get(); }
 
   void SyncWithAllThreads() {
     // New tasks might be posted while we are syncing, but in
@@ -142,7 +140,6 @@
   std::unique_ptr<AudioManagerThread> audio_thread_;
   media::FakeAudioLogFactory log_factory_;
   media::ScopedAudioManagerPtr audio_manager_;
-  std::unique_ptr<media::AudioSystem> audio_system_;
 
   DISALLOW_COPY_AND_ASSIGN(AudioOutputAuthorizationHandlerTest);
 };
@@ -154,7 +151,7 @@
       .Times(1);
   std::unique_ptr<AudioOutputAuthorizationHandler> handler =
       base::MakeUnique<AudioOutputAuthorizationHandler>(
-          GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
+          GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
 
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
@@ -175,7 +172,7 @@
       .Times(1);
   std::unique_ptr<AudioOutputAuthorizationHandler> handler =
       base::MakeUnique<AudioOutputAuthorizationHandler>(
-          GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
+          GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
 
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
@@ -197,7 +194,7 @@
   MockAuthorizationCallback listener;
   std::unique_ptr<AudioOutputAuthorizationHandler> handler =
       base::MakeUnique<AudioOutputAuthorizationHandler>(
-          GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
+          GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
       base::Bind(
@@ -228,7 +225,7 @@
   MockAuthorizationCallback listener;
   std::unique_ptr<AudioOutputAuthorizationHandler> handler =
       base::MakeUnique<AudioOutputAuthorizationHandler>(
-          GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
+          GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
   BrowserThread::PostTask(
       BrowserThread::IO, FROM_HERE,
       base::Bind(
@@ -258,7 +255,7 @@
   MockAuthorizationCallback listener;
   std::unique_ptr<AudioOutputAuthorizationHandler> handler =
       base::MakeUnique<AudioOutputAuthorizationHandler>(
-          GetAudioSystem(), GetMediaStreamManager(), RPH->GetID(), kSalt);
+          GetAudioManager(), GetMediaStreamManager(), RPH->GetID(), kSalt);
   EXPECT_EQ(RPH->bad_msg_count(), 0);
 
   EXPECT_CALL(listener,
@@ -293,7 +290,7 @@
   MockAuthorizationCallback listener;
   std::unique_ptr<AudioOutputAuthorizationHandler> handler =
       base::MakeUnique<AudioOutputAuthorizationHandler>(
-          GetAudioSystem(), GetMediaStreamManager(), RPH->GetID(), kSalt);
+          GetAudioManager(), GetMediaStreamManager(), RPH->GetID(), kSalt);
 
   EXPECT_EQ(RPH->bad_msg_count(), 0);
   EXPECT_CALL(listener, Run(_, _, _, _)).Times(0);
@@ -317,7 +314,7 @@
   MockAuthorizationCallback listener;
   std::unique_ptr<AudioOutputAuthorizationHandler> handler =
       base::MakeUnique<AudioOutputAuthorizationHandler>(
-          GetAudioSystem(), GetMediaStreamManager(), kRenderProcessId, kSalt);
+          GetAudioManager(), GetMediaStreamManager(), kRenderProcessId, kSalt);
 
   EXPECT_CALL(listener,
               Run(media::OUTPUT_DEVICE_STATUS_OK, false, _, kDefaultDeviceId))
diff --git a/content/browser/renderer_host/media/audio_renderer_host.cc b/content/browser/renderer_host/media/audio_renderer_host.cc
index 0f4f84d7..6a99670 100644
--- a/content/browser/renderer_host/media/audio_renderer_host.cc
+++ b/content/browser/renderer_host/media/audio_renderer_host.cc
@@ -61,7 +61,6 @@
 
 AudioRendererHost::AudioRendererHost(int render_process_id,
                                      media::AudioManager* audio_manager,
-                                     media::AudioSystem* audio_system,
                                      AudioMirroringManager* mirroring_manager,
                                      MediaStreamManager* media_stream_manager,
                                      const std::string& salt)
@@ -72,7 +71,7 @@
       media_stream_manager_(media_stream_manager),
       salt_(salt),
       validate_render_frame_id_function_(&ValidateRenderFrameId),
-      authorization_handler_(audio_system,
+      authorization_handler_(audio_manager_,
                              media_stream_manager,
                              render_process_id_,
                              salt) {
diff --git a/content/browser/renderer_host/media/audio_renderer_host.h b/content/browser/renderer_host/media/audio_renderer_host.h
index dda8b38..0d0ca36 100644
--- a/content/browser/renderer_host/media/audio_renderer_host.h
+++ b/content/browser/renderer_host/media/audio_renderer_host.h
@@ -60,7 +60,6 @@
 namespace media {
 class AudioManager;
 class AudioParameters;
-class AudioSystem;
 }
 
 namespace content {
@@ -75,7 +74,6 @@
   // Called from UI thread from the owner of this object.
   AudioRendererHost(int render_process_id,
                     media::AudioManager* audio_manager,
-                    media::AudioSystem* audio_system,
                     AudioMirroringManager* mirroring_manager,
                     MediaStreamManager* media_stream_manager,
                     const std::string& salt);
diff --git a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
index 8d44ee6..41d6ffb36 100644
--- a/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
+++ b/content/browser/renderer_host/media/audio_renderer_host_unittest.cc
@@ -26,7 +26,6 @@
 #include "content/public/test/test_browser_context.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "ipc/ipc_message_utils.h"
-#include "media/audio/audio_system_impl.h"
 #include "media/audio/fake_audio_log_factory.h"
 #include "media/audio/fake_audio_manager.h"
 #include "media/base/bind_to_current_loop.h"
@@ -129,13 +128,11 @@
   MockAudioRendererHost(base::RunLoop* auth_run_loop,
                         int render_process_id,
                         media::AudioManager* audio_manager,
-                        media::AudioSystem* audio_system,
                         AudioMirroringManager* mirroring_manager,
                         MediaStreamManager* media_stream_manager,
                         const std::string& salt)
       : AudioRendererHost(render_process_id,
                           audio_manager,
-                          audio_system,
                           mirroring_manager,
                           media_stream_manager,
                           salt),
@@ -238,15 +235,13 @@
         audio_manager_(base::MakeUnique<FakeAudioManagerWithAssociations>(
             base::ThreadTaskRunnerHandle::Get(),
             log_factory.get())),
-        audio_system_(media::AudioSystemImpl::Create(audio_manager_.get())),
         render_process_host_(&browser_context_, &auth_run_loop_) {
     base::CommandLine::ForCurrentProcess()->AppendSwitch(
         switches::kUseFakeDeviceForMediaStream);
     media_stream_manager_.reset(new MediaStreamManager(audio_manager_.get()));
     host_ = new MockAudioRendererHost(
         &auth_run_loop_, render_process_host_.GetID(), audio_manager_.get(),
-        audio_system_.get(), &mirroring_manager_, media_stream_manager_.get(),
-        kSalt);
+        &mirroring_manager_, media_stream_manager_.get(), kSalt);
 
     // Simulate IPC channel connected.
     host_->set_peer_process_for_testing(base::Process::Current());
@@ -516,7 +511,6 @@
   TestBrowserContext browser_context_;
   std::unique_ptr<media::FakeAudioLogFactory> log_factory;
   std::unique_ptr<FakeAudioManagerWithAssociations> audio_manager_;
-  std::unique_ptr<media::AudioSystem> audio_system_;
   MockAudioMirroringManager mirroring_manager_;
   base::RunLoop auth_run_loop_;
   MockRenderProcessHostWithSignaling render_process_host_;
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 05193e9..5e96c37 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -89,7 +89,6 @@
 #include "content/browser/media/midi_host.h"
 #include "content/browser/memory/memory_coordinator_impl.h"
 #include "content/browser/memory/memory_message_filter.h"
-#include "content/browser/message_port_message_filter.h"
 #include "content/browser/mime_registry_impl.h"
 #include "content/browser/notifications/notification_message_filter.h"
 #include "content/browser/notifications/platform_notification_context_impl.h"
@@ -1089,8 +1088,8 @@
       BrowserMainLoop::GetInstance()->user_input_monitor());
   AddFilter(audio_input_renderer_host_.get());
   audio_renderer_host_ = new AudioRendererHost(
-      GetID(), audio_manager, BrowserMainLoop::GetInstance()->audio_system(),
-      AudioMirroringManager::GetInstance(), media_stream_manager,
+      GetID(), audio_manager, AudioMirroringManager::GetInstance(),
+      media_stream_manager,
       browser_context->GetResourceContext()->GetMediaDeviceIDSalt());
   AddFilter(audio_renderer_host_.get());
   AddFilter(
@@ -1137,19 +1136,13 @@
   channel_->AddFilter(new FontCacheDispatcher());
 #endif
 
-  message_port_message_filter_ = new MessagePortMessageFilter(
-      base::Bind(&RenderWidgetHelper::GetNextRoutingID,
-                 base::Unretained(widget_helper_.get())));
-  AddFilter(message_port_message_filter_.get());
-
   scoped_refptr<CacheStorageDispatcherHost> cache_storage_filter =
       new CacheStorageDispatcherHost();
   cache_storage_filter->Init(storage_partition_impl_->GetCacheStorageContext());
   AddFilter(cache_storage_filter.get());
 
   scoped_refptr<ServiceWorkerDispatcherHost> service_worker_filter =
-      new ServiceWorkerDispatcherHost(
-          GetID(), message_port_message_filter_.get(), resource_context);
+      new ServiceWorkerDispatcherHost(GetID(), resource_context);
   service_worker_filter->Init(
       storage_partition_impl_->GetServiceWorkerContext());
   AddFilter(service_worker_filter.get());
@@ -1165,7 +1158,8 @@
           storage_partition_impl_->GetDatabaseTracker(),
           storage_partition_impl_->GetIndexedDBContext(),
           storage_partition_impl_->GetServiceWorkerContext()),
-      message_port_message_filter_.get()));
+      base::Bind(&RenderWidgetHelper::GetNextRoutingID,
+                 base::Unretained(widget_helper_.get()))));
 
 #if BUILDFLAG(ENABLE_WEBRTC)
   p2p_socket_dispatcher_host_ = new P2PSocketDispatcherHost(
@@ -2250,9 +2244,6 @@
   // OnChannelClosed() to IPC::ChannelProxy::Context on the IO thread.
   ResetChannelProxy();
 
-  // The following members should be cleared in ProcessDied() as well!
-  message_port_message_filter_ = NULL;
-
   // Its important to remove the kSessionStorageHolder after the channel
   // has been reset to avoid deleting the underlying namespaces prior
   // to processing ipcs referring to them.
@@ -2740,8 +2731,6 @@
     observer.RenderProcessExited(this, status, exit_code);
   within_process_died_observer_ = false;
 
-  message_port_message_filter_ = NULL;
-
   RemoveUserData(kSessionStorageHolderKey);
 
   IDMap<IPC::Listener*>::iterator iter(&listeners_);
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 0ef85c8..8fb3a0f68 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -60,7 +60,6 @@
 class GpuClient;
 class IndexedDBDispatcherHost;
 class InProcessChildThreadParams;
-class MessagePortMessageFilter;
 class NotificationMessageFilter;
 #if BUILDFLAG(ENABLE_WEBRTC)
 class P2PSocketDispatcherHost;
@@ -259,10 +258,6 @@
     return render_frame_message_filter_.get();
   }
 
-  MessagePortMessageFilter* message_port_message_filter() const {
-    return message_port_message_filter_.get();
-  }
-
   NotificationMessageFilter* notification_message_filter() const {
     return notification_message_filter_.get();
   }
@@ -475,9 +470,6 @@
 
   scoped_refptr<RenderFrameMessageFilter> render_frame_message_filter_;
 
-  // The filter for MessagePort messages coming from the renderer.
-  scoped_refptr<MessagePortMessageFilter> message_port_message_filter_;
-
   // The filter for Web Notification messages coming from the renderer. Holds a
   // closure per notification that must be freed when the notification closes.
   scoped_refptr<NotificationMessageFilter> notification_message_filter_;
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc
index 4aed03ff..629fc51 100644
--- a/content/browser/service_worker/embedded_worker_instance.cc
+++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -817,11 +817,6 @@
   return MSG_ROUTING_NONE;
 }
 
-MessagePortMessageFilter* EmbeddedWorkerInstance::message_port_message_filter()
-    const {
-  return registry_->MessagePortMessageFilterForProcess(process_id());
-}
-
 void EmbeddedWorkerInstance::AddListener(Listener* listener) {
   listener_list_.AddObserver(listener);
 }
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h
index 6fb78da..cc5ef57 100644
--- a/content/browser/service_worker/embedded_worker_instance.h
+++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -41,7 +41,6 @@
 
 class EmbeddedWorkerRegistry;
 struct EmbeddedWorkerStartParams;
-class MessagePortMessageFilter;
 class ServiceWorkerContextCore;
 
 // This gives an interface to control one EmbeddedWorker instance, which
@@ -142,7 +141,6 @@
   // that is, when |process_id()| returns a valid process id.
   bool is_new_process() const;
   int worker_devtools_agent_route_id() const;
-  MessagePortMessageFilter* message_port_message_filter() const;
 
   void AddListener(Listener* listener);
   void RemoveListener(Listener* listener);
diff --git a/content/browser/service_worker/embedded_worker_registry.cc b/content/browser/service_worker/embedded_worker_registry.cc
index cf9dbe7..fbc629d 100644
--- a/content/browser/service_worker/embedded_worker_registry.cc
+++ b/content/browser/service_worker/embedded_worker_registry.cc
@@ -179,19 +179,14 @@
                                  line_number, source_url);
 }
 
-void EmbeddedWorkerRegistry::AddChildProcessSender(
-    int process_id,
-    IPC::Sender* sender,
-    MessagePortMessageFilter* message_port_message_filter) {
+void EmbeddedWorkerRegistry::AddChildProcessSender(int process_id,
+                                                   IPC::Sender* sender) {
   process_sender_map_[process_id] = sender;
-  process_message_port_message_filter_map_[process_id] =
-      message_port_message_filter;
   DCHECK(!base::ContainsKey(worker_process_map_, process_id));
 }
 
 void EmbeddedWorkerRegistry::RemoveChildProcessSender(int process_id) {
   process_sender_map_.erase(process_id);
-  process_message_port_message_filter_map_.erase(process_id);
   std::map<int, std::set<int> >::iterator found =
       worker_process_map_.find(process_id);
   if (found != worker_process_map_.end()) {
@@ -227,11 +222,6 @@
   return true;
 }
 
-MessagePortMessageFilter*
-EmbeddedWorkerRegistry::MessagePortMessageFilterForProcess(int process_id) {
-  return process_message_port_message_filter_map_[process_id];
-}
-
 EmbeddedWorkerRegistry::EmbeddedWorkerRegistry(
     const base::WeakPtr<ServiceWorkerContextCore>& context,
     int initial_embedded_worker_id)
diff --git a/content/browser/service_worker/embedded_worker_registry.h b/content/browser/service_worker/embedded_worker_registry.h
index 1fa5537..8561ce4 100644
--- a/content/browser/service_worker/embedded_worker_registry.h
+++ b/content/browser/service_worker/embedded_worker_registry.h
@@ -29,7 +29,6 @@
 namespace content {
 
 class EmbeddedWorkerInstance;
-class MessagePortMessageFilter;
 class ServiceWorkerContextCore;
 
 // Acts as a thin stub between MessageFilter and each EmbeddedWorkerInstance,
@@ -90,10 +89,7 @@
                               const GURL& source_url);
 
   // Keeps a map from process_id to sender information.
-  void AddChildProcessSender(
-      int process_id,
-      IPC::Sender* sender,
-      MessagePortMessageFilter* message_port_message_filter);
+  void AddChildProcessSender(int process_id, IPC::Sender* sender);
   void RemoveChildProcessSender(int process_id);
 
   // Returns an embedded worker instance for given |embedded_worker_id|.
@@ -102,8 +98,6 @@
   // Returns true if |embedded_worker_id| is managed by this registry.
   bool CanHandle(int embedded_worker_id) const;
 
-  MessagePortMessageFilter* MessagePortMessageFilterForProcess(int process_id);
-
  private:
   friend class base::RefCounted<EmbeddedWorkerRegistry>;
   friend class MojoEmbeddedWorkerInstanceTest;
@@ -114,8 +108,6 @@
 
   using WorkerInstanceMap = std::map<int, EmbeddedWorkerInstance*>;
   using ProcessToSenderMap = std::map<int, IPC::Sender*>;
-  using ProcessToMessagePortMessageFilterMap =
-      std::map<int, MessagePortMessageFilter*>;
 
   EmbeddedWorkerRegistry(
       const base::WeakPtr<ServiceWorkerContextCore>& context,
@@ -145,7 +137,6 @@
 
   WorkerInstanceMap worker_map_;
   ProcessToSenderMap process_sender_map_;
-  ProcessToMessagePortMessageFilterMap process_message_port_message_filter_map_;
 
   // Map from process_id to embedded_worker_id.
   // This map only contains starting and running workers.
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index caa07fcf..edaeb0de5 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -15,7 +15,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
-#include "content/browser/message_port_message_filter.h"
 #include "content/browser/service_worker/embedded_worker_instance.h"
 #include "content/browser/service_worker/embedded_worker_registry.h"
 #include "content/browser/service_worker/embedded_worker_status.h"
@@ -37,28 +36,6 @@
 
 namespace content {
 
-namespace {
-
-class MockMessagePortMessageFilter : public MessagePortMessageFilter {
- public:
-  MockMessagePortMessageFilter()
-      : MessagePortMessageFilter(
-            base::Bind(&base::AtomicSequenceNumber::GetNext,
-                       base::Unretained(&next_routing_id_))) {}
-
-  bool Send(IPC::Message* message) override {
-    message_queue_.push_back(base::WrapUnique(message));
-    return true;
-  }
-
- private:
-  ~MockMessagePortMessageFilter() override {}
-  base::AtomicSequenceNumber next_routing_id_;
-  std::vector<std::unique_ptr<IPC::Message>> message_queue_;
-};
-
-}  // namespace
-
 EmbeddedWorkerTestHelper::MockEmbeddedWorkerInstanceClient::
     MockEmbeddedWorkerInstanceClient(
         base::WeakPtr<EmbeddedWorkerTestHelper> helper)
@@ -235,8 +212,7 @@
                          base::ThreadTaskRunnerHandle::Get(), nullptr, nullptr);
   wrapper_->process_manager()->SetProcessIdForTest(mock_render_process_id());
   wrapper_->process_manager()->SetNewProcessIdForTest(new_render_process_id());
-  registry()->AddChildProcessSender(mock_render_process_id_, this,
-                                    NewMessagePortMessageFilter());
+  registry()->AddChildProcessSender(mock_render_process_id_, this);
 
   // Setup process level interface registry.
   render_process_interface_registry_ =
@@ -252,8 +228,7 @@
 
 void EmbeddedWorkerTestHelper::SimulateAddProcessToPattern(const GURL& pattern,
                                                            int process_id) {
-  registry()->AddChildProcessSender(process_id, this,
-                                    NewMessagePortMessageFilter());
+  registry()->AddChildProcessSender(process_id, this);
   wrapper_->process_manager()->AddProcessReferenceToPattern(pattern,
                                                             process_id);
 }
@@ -628,14 +603,6 @@
   return context()->embedded_worker_registry();
 }
 
-MessagePortMessageFilter*
-EmbeddedWorkerTestHelper::NewMessagePortMessageFilter() {
-  scoped_refptr<MessagePortMessageFilter> filter(
-      new MockMessagePortMessageFilter);
-  message_port_message_filters_.push_back(filter);
-  return filter.get();
-}
-
 std::unique_ptr<service_manager::InterfaceRegistry>
 EmbeddedWorkerTestHelper::CreateInterfaceRegistry(MockRenderProcessHost* rph) {
   auto registry =
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h
index 094032b4..779db77 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.h
+++ b/content/browser/service_worker/embedded_worker_test_helper.h
@@ -37,7 +37,6 @@
 
 class EmbeddedWorkerRegistry;
 class EmbeddedWorkerTestHelper;
-class MessagePortMessageFilter;
 class MockRenderProcessHost;
 class ServiceWorkerContextCore;
 class ServiceWorkerContextWrapper;
@@ -271,8 +270,6 @@
       const mojom::ServiceWorkerEventDispatcher::
           DispatchPaymentRequestEventCallback& callback);
 
-  MessagePortMessageFilter* NewMessagePortMessageFilter();
-
   std::unique_ptr<service_manager::InterfaceRegistry> CreateInterfaceRegistry(
       MockRenderProcessHost* rph);
 
@@ -305,9 +302,6 @@
   // Updated each time MessageToWorker message is received.
   int current_embedded_worker_id_;
 
-  std::vector<scoped_refptr<MessagePortMessageFilter>>
-      message_port_message_filters_;
-
   base::WeakPtrFactory<EmbeddedWorkerTestHelper> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerTestHelper);
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc
index 51c500c..96f7899 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc
@@ -16,8 +16,6 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "content/browser/bad_message.h"
-#include "content/browser/message_port_message_filter.h"
-#include "content/browser/message_port_service.h"
 #include "content/browser/service_worker/embedded_worker_registry.h"
 #include "content/browser/service_worker/embedded_worker_status.h"
 #include "content/browser/service_worker/service_worker_client_utils.h"
@@ -107,12 +105,10 @@
 
 ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost(
     int render_process_id,
-    MessagePortMessageFilter* message_port_message_filter,
     ResourceContext* resource_context)
     : BrowserMessageFilter(kFilteredMessageClasses,
                            arraysize(kFilteredMessageClasses)),
       render_process_id_(render_process_id),
-      message_port_message_filter_(message_port_message_filter),
       resource_context_(resource_context),
       channel_ready_(false),
       weak_factory_(this) {
@@ -143,7 +139,7 @@
   if (!GetContext())
     return;
   GetContext()->embedded_worker_registry()->AddChildProcessSender(
-      render_process_id_, this, message_port_message_filter_);
+      render_process_id_, this);
 }
 
 void ServiceWorkerDispatcherHost::OnFilterAdded(IPC::Channel* channel) {
@@ -941,7 +937,7 @@
     int provider_id,
     const base::string16& message,
     const url::Origin& source_origin,
-    const std::vector<int>& sent_message_ports) {
+    const std::vector<MessagePort>& sent_message_ports) {
   TRACE_EVENT0("ServiceWorker",
                "ServiceWorkerDispatcherHost::OnPostMessageToWorker");
   if (!GetContext())
@@ -971,12 +967,9 @@
     scoped_refptr<ServiceWorkerVersion> worker,
     const base::string16& message,
     const url::Origin& source_origin,
-    const std::vector<int>& sent_message_ports,
+    const std::vector<MessagePort>& sent_message_ports,
     ServiceWorkerProviderHost* sender_provider_host,
     const StatusCallback& callback) {
-  for (int port : sent_message_ports)
-    MessagePortService::GetInstance()->HoldMessages(port);
-
   switch (sender_provider_host->provider_type()) {
     case SERVICE_WORKER_PROVIDER_FOR_WINDOW:
     case SERVICE_WORKER_PROVIDER_FOR_WORKER:
@@ -1171,7 +1164,7 @@
     scoped_refptr<ServiceWorkerVersion> worker,
     const base::string16& message,
     const url::Origin& source_origin,
-    const std::vector<int>& sent_message_ports,
+    const std::vector<MessagePort>& sent_message_ports,
     const base::Optional<base::TimeDelta>& timeout,
     const StatusCallback& callback,
     const SourceInfo& source_info) {
@@ -1207,7 +1200,7 @@
         scoped_refptr<ServiceWorkerVersion> worker,
         const base::string16& message,
         const url::Origin& source_origin,
-        const std::vector<int>& sent_message_ports,
+        const std::vector<MessagePort>& sent_message_ports,
         const ExtendableMessageEventSource& source,
         const base::Optional<base::TimeDelta>& timeout,
         const StatusCallback& callback) {
@@ -1221,16 +1214,10 @@
                                       callback);
   }
 
-  MessagePortMessageFilter* filter =
-      worker->embedded_worker()->message_port_message_filter();
-  std::vector<int> new_routing_ids;
-  filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids);
-
   mojom::ExtendableMessageEventPtr event = mojom::ExtendableMessageEvent::New();
   event->message = message;
   event->source_origin = source_origin;
-  event->message_ports = sent_message_ports;
-  event->new_routing_ids = new_routing_ids;
+  event->message_ports = MessagePort::ReleaseHandles(sent_message_ports);
   event->source = source;
 
   // Hide the client url if the client has a unique origin.
@@ -1247,13 +1234,10 @@
 
 template <typename SourceInfo>
 void ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent(
-    const std::vector<int>& sent_message_ports,
+    const std::vector<MessagePort>& sent_message_ports,
     const SourceInfo& source_info,
     const StatusCallback& callback,
     ServiceWorkerStatusCode status) {
-  // Transfering the message ports failed, so destroy the ports.
-  for (int port : sent_message_ports)
-    MessagePortService::GetInstance()->ClosePort(port);
   if (source_info.IsValid())
     ReleaseSourceInfo(source_info);
   callback.Run(status);
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.h b/content/browser/service_worker/service_worker_dispatcher_host.h
index 0e63d000..e33a7e8 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host.h
+++ b/content/browser/service_worker/service_worker_dispatcher_host.h
@@ -30,7 +30,7 @@
 
 namespace content {
 
-class MessagePortMessageFilter;
+class MessagePort;
 class ResourceContext;
 class ServiceWorkerContextCore;
 class ServiceWorkerContextWrapper;
@@ -49,7 +49,6 @@
  public:
   ServiceWorkerDispatcherHost(
       int render_process_id,
-      MessagePortMessageFilter* message_port_message_filter,
       ResourceContext* resource_context);
 
   void Init(ServiceWorkerContextWrapper* context_wrapper);
@@ -81,10 +80,6 @@
       base::WeakPtr<ServiceWorkerProviderHost> provider_host,
       ServiceWorkerRegistration* registration);
 
-  MessagePortMessageFilter* message_port_message_filter() {
-    return message_port_message_filter_;
-  }
-
  protected:
   ~ServiceWorkerDispatcherHost() override;
 
@@ -169,11 +164,12 @@
   void OnDecrementServiceWorkerRefCount(int handle_id);
   void OnIncrementRegistrationRefCount(int registration_handle_id);
   void OnDecrementRegistrationRefCount(int registration_handle_id);
-  void OnPostMessageToWorker(int handle_id,
-                             int provider_id,
-                             const base::string16& message,
-                             const url::Origin& source_origin,
-                             const std::vector<int>& sent_message_ports);
+  void OnPostMessageToWorker(
+      int handle_id,
+      int provider_id,
+      const base::string16& message,
+      const url::Origin& source_origin,
+      const std::vector<MessagePort>& sent_message_ports);
 
   void OnTerminateWorker(int handle_id);
 
@@ -181,7 +177,7 @@
       scoped_refptr<ServiceWorkerVersion> worker,
       const base::string16& message,
       const url::Origin& source_origin,
-      const std::vector<int>& sent_message_ports,
+      const std::vector<MessagePort>& sent_message_ports,
       ServiceWorkerProviderHost* sender_provider_host,
       const StatusCallback& callback);
   template <typename SourceInfo>
@@ -189,7 +185,7 @@
       scoped_refptr<ServiceWorkerVersion> worker,
       const base::string16& message,
       const url::Origin& source_origin,
-      const std::vector<int>& sent_message_ports,
+      const std::vector<MessagePort>& sent_message_ports,
       const base::Optional<base::TimeDelta>& timeout,
       const StatusCallback& callback,
       const SourceInfo& source_info);
@@ -197,13 +193,13 @@
       scoped_refptr<ServiceWorkerVersion> worker,
       const base::string16& message,
       const url::Origin& source_origin,
-      const std::vector<int>& sent_message_ports,
+      const std::vector<MessagePort>& sent_message_ports,
       const ExtendableMessageEventSource& source,
       const base::Optional<base::TimeDelta>& timeout,
       const StatusCallback& callback);
   template <typename SourceInfo>
   void DidFailToDispatchExtendableMessageEvent(
-      const std::vector<int>& sent_message_ports,
+      const std::vector<MessagePort>& sent_message_ports,
       const SourceInfo& source_info,
       const StatusCallback& callback,
       ServiceWorkerStatusCode status);
@@ -275,7 +271,6 @@
                                         ServiceWorkerStatusCode status);
 
   const int render_process_id_;
-  MessagePortMessageFilter* const message_port_message_filter_;
   ResourceContext* resource_context_;
   scoped_refptr<ServiceWorkerContextWrapper> context_wrapper_;
 
diff --git a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
index 638b46b..46bcb77 100644
--- a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
+++ b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc
@@ -15,7 +15,6 @@
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "content/browser/browser_thread_impl.h"
-#include "content/browser/message_port_service.h"
 #include "content/browser/service_worker/embedded_worker_instance.h"
 #include "content/browser/service_worker/embedded_worker_registry.h"
 #include "content/browser/service_worker/embedded_worker_status.h"
@@ -45,11 +44,10 @@
   *out = status;
 }
 
-void SetUpDummyMessagePort(std::vector<int>* ports) {
-  int port_id = -1;
-  MessagePortService::GetInstance()->Create(MSG_ROUTING_NONE, nullptr,
-                                            &port_id);
-  ports->push_back(port_id);
+void SetUpDummyMessagePort(std::vector<MessagePort>* ports) {
+  // Let the other end of the pipe close.
+  mojo::MessagePipe pipe;
+  ports->push_back(MessagePort(std::move(pipe.handle0)));
 }
 
 }  // namespace
@@ -63,7 +61,7 @@
       ServiceWorkerContextWrapper* context_wrapper,
       ResourceContext* resource_context,
       EmbeddedWorkerTestHelper* helper)
-      : ServiceWorkerDispatcherHost(process_id, nullptr, resource_context),
+      : ServiceWorkerDispatcherHost(process_id, resource_context),
         bad_messages_received_count_(0),
         helper_(helper) {
     Init(context_wrapper);
@@ -238,7 +236,7 @@
       scoped_refptr<ServiceWorkerVersion> worker,
       const base::string16& message,
       const url::Origin& source_origin,
-      const std::vector<int>& sent_message_ports,
+      const std::vector<MessagePort>& sent_message_ports,
       ServiceWorkerProviderHost* sender_provider_host,
       const ServiceWorkerDispatcherHost::StatusCallback& callback) {
     dispatcher_host_->DispatchExtendableMessageEvent(
@@ -717,24 +715,18 @@
   EXPECT_EQ(base::TimeDelta::FromSeconds(6), remaining_time);
 
   // Dispatch ExtendableMessageEvent.
-  std::vector<int> ports;
+  std::vector<MessagePort> ports;
   SetUpDummyMessagePort(&ports);
   called = false;
   status = SERVICE_WORKER_ERROR_MAX_VALUE;
   DispatchExtendableMessageEvent(
       version_, base::string16(), url::Origin(version_->scope().GetOrigin()),
       ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status));
-  for (int port : ports)
-    EXPECT_TRUE(MessagePortService::GetInstance()->AreMessagesHeld(port));
   EXPECT_EQ(ref_count + 1, sender_worker_handle->ref_count());
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(called);
   EXPECT_EQ(SERVICE_WORKER_OK, status);
 
-  // Messages should be held until ports are created at the destination.
-  for (int port : ports)
-    EXPECT_TRUE(MessagePortService::GetInstance()->AreMessagesHeld(port));
-
   EXPECT_EQ(ref_count + 1, sender_worker_handle->ref_count());
 
   // Timeout of message event should not have extended life of service worker.
@@ -751,22 +743,16 @@
 
   // Try to dispatch ExtendableMessageEvent. This should fail to start the
   // worker and to dispatch the event.
-  std::vector<int> ports;
+  std::vector<MessagePort> ports;
   SetUpDummyMessagePort(&ports);
   bool called = false;
   ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
   DispatchExtendableMessageEvent(
       version_, base::string16(), url::Origin(version_->scope().GetOrigin()),
       ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status));
-  for (int port : ports)
-    EXPECT_TRUE(MessagePortService::GetInstance()->AreMessagesHeld(port));
   base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(called);
   EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status);
-
-  // The error callback should clean up the ports and handle.
-  for (int port : ports)
-    EXPECT_FALSE(MessagePortService::GetInstance()->AreMessagesHeld(port));
 }
 
 TEST_F(ServiceWorkerDispatcherHostTest, OnSetHostedVersionId) {
diff --git a/content/browser/service_worker/service_worker_handle_unittest.cc b/content/browser/service_worker/service_worker_handle_unittest.cc
index 32716e1..1b6e7832 100644
--- a/content/browser/service_worker/service_worker_handle_unittest.cc
+++ b/content/browser/service_worker/service_worker_handle_unittest.cc
@@ -51,7 +51,7 @@
       ServiceWorkerContextWrapper* context_wrapper,
       ResourceContext* resource_context,
       EmbeddedWorkerTestHelper* helper)
-      : ServiceWorkerDispatcherHost(process_id, nullptr, resource_context),
+      : ServiceWorkerDispatcherHost(process_id, resource_context),
         bad_message_received_count_(0),
         helper_(helper) {
     Init(context_wrapper);
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc
index 2e6394b..f15022e 100644
--- a/content/browser/service_worker/service_worker_provider_host.cc
+++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -10,7 +10,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
 #include "base/time/time.h"
-#include "content/browser/message_port_message_filter.h"
 #include "content/browser/service_worker/embedded_worker_status.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_context_request_handler.h"
@@ -441,22 +440,16 @@
 void ServiceWorkerProviderHost::PostMessageToClient(
     ServiceWorkerVersion* version,
     const base::string16& message,
-    const std::vector<int>& sent_message_ports) {
+    const std::vector<MessagePort>& sent_message_ports) {
   if (!dispatcher_host_)
     return;  // Could be NULL in some tests.
 
-  std::vector<int> new_routing_ids;
-  dispatcher_host_->message_port_message_filter()->
-      UpdateMessagePortsWithNewRoutes(sent_message_ports,
-                                      &new_routing_ids);
-
   ServiceWorkerMsg_MessageToDocument_Params params;
   params.thread_id = kDocumentMainThreadId;
   params.provider_id = provider_id();
   params.service_worker_info = GetOrCreateServiceWorkerHandle(version);
   params.message = message;
   params.message_ports = sent_message_ports;
-  params.new_routing_ids = new_routing_ids;
   Send(new ServiceWorkerMsg_MessageToDocument(params));
 }
 
diff --git a/content/browser/service_worker/service_worker_provider_host.h b/content/browser/service_worker/service_worker_provider_host.h
index af78af83..e42c5a46 100644
--- a/content/browser/service_worker/service_worker_provider_host.h
+++ b/content/browser/service_worker/service_worker_provider_host.h
@@ -31,6 +31,7 @@
 
 namespace content {
 
+class MessagePort;
 class ResourceRequestBodyImpl;
 class ServiceWorkerContextCore;
 class ServiceWorkerDispatcherHost;
@@ -232,7 +233,7 @@
   // Dispatches message event to the document.
   void PostMessageToClient(ServiceWorkerVersion* version,
                            const base::string16& message,
-                           const std::vector<int>& sent_message_ports);
+                           const std::vector<MessagePort>& sent_message_ports);
 
   // Notifies the client that its controller used a feature, for UseCounter
   // purposes. This can only be called if IsProviderForClient() is true.
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index b82770ce..8844827 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -27,8 +27,6 @@
 #include "base/time/time.h"
 #include "content/browser/bad_message.h"
 #include "content/browser/child_process_security_policy_impl.h"
-#include "content/browser/message_port_message_filter.h"
-#include "content/browser/message_port_service.h"
 #include "content/browser/service_worker/embedded_worker_instance.h"
 #include "content/browser/service_worker/embedded_worker_registry.h"
 #include "content/browser/service_worker/embedded_worker_status.h"
@@ -1218,7 +1216,7 @@
 void ServiceWorkerVersion::OnPostMessageToClient(
     const std::string& client_uuid,
     const base::string16& message,
-    const std::vector<int>& sent_message_ports) {
+    const std::vector<MessagePort>& sent_message_ports) {
   if (!context_)
     return;
   TRACE_EVENT1("ServiceWorker",
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index cf37ce59..8e2b421 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -56,6 +56,7 @@
 
 namespace content {
 
+class MessagePort;
 class ServiceWorkerContextCore;
 class ServiceWorkerProviderHost;
 class ServiceWorkerRegistration;
@@ -659,9 +660,10 @@
   void OnClearCachedMetadata(const GURL& url);
   void OnClearCachedMetadataFinished(int64_t callback_id, int result);
 
-  void OnPostMessageToClient(const std::string& client_uuid,
-                             const base::string16& message,
-                             const std::vector<int>& sent_message_ports);
+  void OnPostMessageToClient(
+      const std::string& client_uuid,
+      const base::string16& message,
+      const std::vector<MessagePort>& sent_message_ports);
   void OnFocusClient(int request_id, const std::string& client_uuid);
   void OnNavigateClient(int request_id,
                         const std::string& client_uuid,
diff --git a/content/browser/shared_worker/shared_worker_host.cc b/content/browser/shared_worker/shared_worker_host.cc
index 21e22369..1ceb6c55 100644
--- a/content/browser/shared_worker/shared_worker_host.cc
+++ b/content/browser/shared_worker/shared_worker_host.cc
@@ -6,8 +6,6 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "content/browser/devtools/shared_worker_devtools_manager.h"
-#include "content/browser/message_port_message_filter.h"
-#include "content/browser/message_port_service.h"
 #include "content/browser/shared_worker/shared_worker_instance.h"
 #include "content/browser/shared_worker/shared_worker_message_filter.h"
 #include "content/browser/shared_worker/shared_worker_service_impl.h"
@@ -57,6 +55,7 @@
       worker_render_filter_(filter),
       worker_process_id_(filter->render_process_id()),
       worker_route_id_(worker_route_id),
+      next_connection_request_id_(1),
       creation_time_(base::TimeTicks::Now()),
       weak_factory_(this) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -89,14 +88,18 @@
     info.filter()->Send(new ViewMsg_WorkerCreated(info.route_id()));
 }
 
-bool SharedWorkerHost::FilterConnectionMessage(
-    int route_id,
-    int sent_message_port_id,
-    SharedWorkerMessageFilter* incoming_filter) {
-  if (!IsAvailable() || !HasFilter(incoming_filter, route_id))
+bool SharedWorkerHost::SendConnectToWorker(int worker_route_id,
+                                           const MessagePort& port,
+                                           SharedWorkerMessageFilter* filter) {
+  if (!IsAvailable() || !HasFilter(filter, worker_route_id))
     return false;
 
-  Connect(route_id, sent_message_port_id, incoming_filter);
+  int connection_request_id = next_connection_request_id_++;
+
+  SetConnectionRequestID(filter, worker_route_id, connection_request_id);
+
+  // Send the connect message with the new connection_request_id.
+  Send(new WorkerMsg_Connect(worker_route_id_, connection_request_id, port));
   return true;
 }
 
@@ -171,9 +174,11 @@
     info.filter()->Send(new ViewMsg_WorkerScriptLoadFailed(info.route_id()));
 }
 
-void SharedWorkerHost::WorkerConnected(int message_port_id) {
+void SharedWorkerHost::WorkerConnected(int connection_request_id) {
+  if (!instance_)
+    return;
   for (const FilterInfo& info : filters_) {
-    if (info.message_port_id() != message_port_id)
+    if (info.connection_request_id() != connection_request_id)
       continue;
     info.filter()->Send(
         new ViewMsg_WorkerConnected(info.route_id(), used_features_));
@@ -259,32 +264,12 @@
   return false;
 }
 
-void SharedWorkerHost::Connect(int route_id,
-                               int sent_message_port_id,
-                               SharedWorkerMessageFilter* incoming_filter) {
-  DCHECK(IsAvailable());
-  DCHECK(HasFilter(incoming_filter, route_id));
-  DCHECK(worker_render_filter_);
-
-  int new_routing_id = worker_render_filter_->GetNextRoutingID();
-  MessagePortService::GetInstance()->UpdateMessagePort(
-      sent_message_port_id,
-      worker_render_filter_->message_port_message_filter(), new_routing_id);
-  SetMessagePortID(incoming_filter, route_id, sent_message_port_id);
-  Send(new WorkerMsg_Connect(worker_route_id_, sent_message_port_id,
-                             new_routing_id));
-
-  // Send any queued messages for the sent port.
-  MessagePortService::GetInstance()->SendQueuedMessagesIfPossible(
-      sent_message_port_id);
-}
-
-void SharedWorkerHost::SetMessagePortID(SharedWorkerMessageFilter* filter,
-                                        int route_id,
-                                        int message_port_id) {
-  for (FilterInfo& info : filters_) {
-    if (info.filter() == filter && info.route_id() == route_id) {
-      info.set_message_port_id(message_port_id);
+void SharedWorkerHost::SetConnectionRequestID(SharedWorkerMessageFilter* filter,
+                                              int route_id,
+                                              int connection_request_id) {
+  for (FilterList::iterator i = filters_.begin(); i != filters_.end(); ++i) {
+    if (i->filter() == filter && i->route_id() == route_id) {
+      i->set_connection_request_id(connection_request_id);
       return;
     }
   }
diff --git a/content/browser/shared_worker/shared_worker_host.h b/content/browser/shared_worker/shared_worker_host.h
index 5e8a4b8e..bdb06fd 100644
--- a/content/browser/shared_worker/shared_worker_host.h
+++ b/content/browser/shared_worker/shared_worker_host.h
@@ -25,6 +25,7 @@
 
 namespace content {
 
+class MessagePort;
 class SharedWorkerMessageFilter;
 class SharedWorkerInstance;
 
@@ -45,9 +46,9 @@
 
   // Returns true iff the given message from a renderer process was forwarded to
   // the worker.
-  bool FilterConnectionMessage(int route_id,
-                               int sent_message_port_id,
-                               SharedWorkerMessageFilter* incoming_filter);
+  bool SendConnectToWorker(int worker_route_id,
+                           const MessagePort& port,
+                           SharedWorkerMessageFilter* filter);
 
   // Handles the shutdown of the filter. If the worker has no other client,
   // sends TerminateWorkerContext message to shut it down.
@@ -69,7 +70,7 @@
   void WorkerReadyForInspection();
   void WorkerScriptLoaded();
   void WorkerScriptLoadFailed();
-  void WorkerConnected(int message_port_id);
+  void WorkerConnected(int connection_request_id);
   void AllowFileSystem(const GURL& url,
                        std::unique_ptr<IPC::Message> reply_msg);
   void AllowIndexedDB(const GURL& url,
@@ -97,16 +98,16 @@
   class FilterInfo {
    public:
     FilterInfo(SharedWorkerMessageFilter* filter, int route_id)
-        : filter_(filter), route_id_(route_id), message_port_id_(0) {}
+        : filter_(filter), route_id_(route_id), connection_request_id_(0) {}
     SharedWorkerMessageFilter* filter() const { return filter_; }
     int route_id() const { return route_id_; }
-    int message_port_id() const { return message_port_id_; }
-    void set_message_port_id(int id) { message_port_id_ = id; }
+    int connection_request_id() const { return connection_request_id_; }
+    void set_connection_request_id(int id) { connection_request_id_ = id; }
 
    private:
     SharedWorkerMessageFilter* filter_;
     const int route_id_;
-    int message_port_id_;
+    int connection_request_id_;
   };
 
   using FilterList = std::list<FilterInfo>;
@@ -116,12 +117,9 @@
 
   void RemoveFilters(SharedWorkerMessageFilter* filter);
   bool HasFilter(SharedWorkerMessageFilter* filter, int route_id) const;
-  void Connect(int route_id,
-               int sent_message_port_id,
-               SharedWorkerMessageFilter* incoming_filter);
-  void SetMessagePortID(SharedWorkerMessageFilter* filter,
-                        int route_id,
-                        int message_port_id);
+  void SetConnectionRequestID(SharedWorkerMessageFilter* filter,
+                              int route_id,
+                              int connection_request_id);
   void AllowFileSystemResponse(std::unique_ptr<IPC::Message> reply_msg,
                                bool allowed);
 
@@ -139,6 +137,7 @@
 
   const int worker_process_id_;
   const int worker_route_id_;
+  int next_connection_request_id_;
   bool termination_message_sent_ = false;
   bool closed_ = false;
   const base::TimeTicks creation_time_;
diff --git a/content/browser/shared_worker/shared_worker_message_filter.cc b/content/browser/shared_worker/shared_worker_message_filter.cc
index 9b5440f..a2ddef3 100644
--- a/content/browser/shared_worker/shared_worker_message_filter.cc
+++ b/content/browser/shared_worker/shared_worker_message_filter.cc
@@ -7,7 +7,6 @@
 #include <stdint.h>
 
 #include "base/macros.h"
-#include "content/browser/message_port_message_filter.h"
 #include "content/browser/shared_worker/shared_worker_service_impl.h"
 #include "content/common/devtools_messages.h"
 #include "content/common/view_messages.h"
@@ -27,14 +26,13 @@
     int render_process_id,
     ResourceContext* resource_context,
     const WorkerStoragePartition& partition,
-    MessagePortMessageFilter* message_port_message_filter)
+    const NextRoutingIDCallback& next_routing_id_callback)
     : BrowserMessageFilter(kFilteredMessageClasses,
                            arraysize(kFilteredMessageClasses)),
       render_process_id_(render_process_id),
       resource_context_(resource_context),
       partition_(partition),
-      message_port_message_filter_(message_port_message_filter) {
-}
+      next_routing_id_callback_(next_routing_id_callback) {}
 
 SharedWorkerMessageFilter::~SharedWorkerMessageFilter() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -89,7 +87,7 @@
 }
 
 int SharedWorkerMessageFilter::GetNextRoutingID() {
-  return message_port_message_filter_->GetNextRoutingID();
+  return next_routing_id_callback_.Run();
 }
 
 void SharedWorkerMessageFilter::OnCreateWorker(
diff --git a/content/browser/shared_worker/shared_worker_message_filter.h b/content/browser/shared_worker/shared_worker_message_filter.h
index a43a9a6f..7f65750 100644
--- a/content/browser/shared_worker/shared_worker_message_filter.h
+++ b/content/browser/shared_worker/shared_worker_message_filter.h
@@ -15,17 +15,18 @@
 struct ViewHostMsg_CreateWorker_Reply;
 
 namespace content {
-class MessagePortMessageFilter;
 class ResourceContext;
 
 // Handles SharedWorker related IPC messages for one renderer process by
 // forwarding them to the SharedWorkerServiceImpl singleton.
 class CONTENT_EXPORT SharedWorkerMessageFilter : public BrowserMessageFilter {
  public:
+  using NextRoutingIDCallback = base::Callback<int(void)>;
+
   SharedWorkerMessageFilter(int render_process_id,
                             ResourceContext* resource_context,
                             const WorkerStoragePartition& partition,
-                            MessagePortMessageFilter* message_port_filter);
+                            const NextRoutingIDCallback& callback);
 
   // BrowserMessageFilter implementation.
   void OnChannelClosing() override;
@@ -34,10 +35,6 @@
   int GetNextRoutingID();
   int render_process_id() const { return render_process_id_; }
 
-  MessagePortMessageFilter* message_port_message_filter() const {
-    return message_port_message_filter_;
-  }
-
  protected:
   // This is protected, so we can define sub classes for testing.
   ~SharedWorkerMessageFilter() override;
@@ -57,7 +54,7 @@
   const int render_process_id_;
   ResourceContext* const resource_context_;
   const WorkerStoragePartition partition_;
-  MessagePortMessageFilter* const message_port_message_filter_;
+  NextRoutingIDCallback next_routing_id_callback_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(SharedWorkerMessageFilter);
 };
diff --git a/content/browser/shared_worker/shared_worker_service_impl.cc b/content/browser/shared_worker/shared_worker_service_impl.cc
index 924582cd2..98998ec 100644
--- a/content/browser/shared_worker/shared_worker_service_impl.cc
+++ b/content/browser/shared_worker/shared_worker_service_impl.cc
@@ -355,13 +355,12 @@
 }
 
 void SharedWorkerServiceImpl::ConnectToWorker(SharedWorkerMessageFilter* filter,
-                                              int route_id,
-                                              int sent_message_port_id) {
+                                              int worker_route_id,
+                                              const MessagePort& port) {
   for (WorkerHostMap::const_iterator iter = worker_hosts_.begin();
        iter != worker_hosts_.end();
        ++iter) {
-    if (iter->second->FilterConnectionMessage(route_id, sent_message_port_id,
-                                              filter))
+    if (iter->second->SendConnectToWorker(worker_route_id, port, filter))
       return;
   }
 }
@@ -436,11 +435,11 @@
 }
 
 void SharedWorkerServiceImpl::WorkerConnected(SharedWorkerMessageFilter* filter,
-                                              int message_port_id,
+                                              int connection_request_id,
                                               int worker_route_id) {
   if (SharedWorkerHost* host =
           FindSharedWorkerHost(filter->render_process_id(), worker_route_id))
-    host->WorkerConnected(message_port_id);
+    host->WorkerConnected(connection_request_id);
 }
 
 void SharedWorkerServiceImpl::AllowFileSystem(SharedWorkerMessageFilter* filter,
diff --git a/content/browser/shared_worker/shared_worker_service_impl.h b/content/browser/shared_worker/shared_worker_service_impl.h
index e6383c8..8c4513b 100644
--- a/content/browser/shared_worker/shared_worker_service_impl.h
+++ b/content/browser/shared_worker/shared_worker_service_impl.h
@@ -28,6 +28,7 @@
 
 namespace content {
 
+class MessagePort;
 class SharedWorkerInstance;
 class SharedWorkerHost;
 class SharedWorkerMessageFilter;
@@ -57,8 +58,8 @@
       ResourceContext* resource_context,
       const WorkerStoragePartitionId& partition_id);
   void ConnectToWorker(SharedWorkerMessageFilter* filter,
-                       int route_id,
-                       int sent_message_port_id);
+                       int worker_route_id,
+                       const MessagePort& port);
   void DocumentDetached(SharedWorkerMessageFilter* filter,
                         unsigned long long document_id);
   void CountFeature(SharedWorkerMessageFilter* filter,
@@ -75,7 +76,7 @@
   void WorkerScriptLoadFailed(SharedWorkerMessageFilter* filter,
                               int worker_route_id);
   void WorkerConnected(SharedWorkerMessageFilter* filter,
-                       int message_port_id,
+                       int connection_request_id,
                        int worker_route_id);
   void AllowFileSystem(SharedWorkerMessageFilter* filter,
                        int worker_route_id,
diff --git a/content/browser/shared_worker/shared_worker_service_impl_unittest.cc b/content/browser/shared_worker/shared_worker_service_impl_unittest.cc
index fec5578f..db5c128 100644
--- a/content/browser/shared_worker/shared_worker_service_impl_unittest.cc
+++ b/content/browser/shared_worker/shared_worker_service_impl_unittest.cc
@@ -18,10 +18,9 @@
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
-#include "content/browser/message_port_message_filter.h"
+#include "base/synchronization/waitable_event.h"
 #include "content/browser/shared_worker/shared_worker_message_filter.h"
 #include "content/browser/shared_worker/worker_storage_partition.h"
-#include "content/common/message_port_messages.h"
 #include "content/common/view_messages.h"
 #include "content/common/worker_messages.h"
 #include "content/public/browser/storage_partition.h"
@@ -112,30 +111,17 @@
 static const unsigned long long kDocumentIDs[] = {200, 201, 202};
 static const int kRenderFrameRouteIDs[] = {300, 301, 302};
 
-class MockMessagePortMessageFilter : public MessagePortMessageFilter {
- public:
-  MockMessagePortMessageFilter(
-      const NextRoutingIDCallback& callback,
-      std::vector<std::unique_ptr<IPC::Message>>* message_queue)
-      : MessagePortMessageFilter(callback), message_queue_(message_queue) {}
+void BlockingReadFromMessagePort(MessagePort port, base::string16* message) {
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+  port.SetCallback(
+      base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event)));
+  event.Wait();
 
-  bool Send(IPC::Message* message) override {
-    std::unique_ptr<IPC::Message> owned(message);
-    if (!message_queue_)
-      return false;
-    message_queue_->push_back(std::move(owned));
-    return true;
-  }
-
-  void Close() {
-    message_queue_ = nullptr;
-    OnChannelClosing();
-  }
-
- private:
-  ~MockMessagePortMessageFilter() override {}
-  std::vector<std::unique_ptr<IPC::Message>>* message_queue_;
-};
+  std::vector<MessagePort> should_be_empty;
+  EXPECT_TRUE(port.GetMessage(message, &should_be_empty));
+  EXPECT_TRUE(should_be_empty.empty());
+}
 
 class MockSharedWorkerMessageFilter : public SharedWorkerMessageFilter {
  public:
@@ -143,12 +129,12 @@
       int render_process_id,
       ResourceContext* resource_context,
       const WorkerStoragePartition& partition,
-      MessagePortMessageFilter* message_port_filter,
+      const SharedWorkerMessageFilter::NextRoutingIDCallback& callback,
       std::vector<std::unique_ptr<IPC::Message>>* message_queue)
       : SharedWorkerMessageFilter(render_process_id,
                                   resource_context,
                                   partition,
-                                  message_port_filter),
+                                  callback),
         message_queue_(message_queue) {}
 
   bool Send(IPC::Message* message) override {
@@ -175,28 +161,24 @@
                           ResourceContext* resource_context,
                           const WorkerStoragePartition& partition)
       : process_id_(process_id),
-        message_filter_(new MockMessagePortMessageFilter(
+        worker_filter_(new MockSharedWorkerMessageFilter(
+            process_id,
+            resource_context,
+            partition,
             base::Bind(&base::AtomicSequenceNumber::GetNext,
                        base::Unretained(&next_routing_id_)),
-            &queued_messages_)),
-        worker_filter_(new MockSharedWorkerMessageFilter(process_id,
-                                                         resource_context,
-                                                         partition,
-                                                         message_filter_.get(),
-                                                         &queued_messages_)) {
+            &queued_messages_)) {
     SharedWorkerServiceImplTest::RegisterRunningProcessID(process_id);
   }
 
   ~MockRendererProcessHost() {
     SharedWorkerServiceImplTest::UnregisterRunningProcessID(process_id_);
-    message_filter_->Close();
     worker_filter_->Close();
   }
 
   bool OnMessageReceived(IPC::Message* message) {
     std::unique_ptr<IPC::Message> msg(message);
-    const bool ret = message_filter_->OnMessageReceived(*message) ||
-                     worker_filter_->OnMessageReceived(*message);
+    const bool ret = worker_filter_->OnMessageReceived(*message);
     if (message->is_sync()) {
       CHECK(!queued_messages_.empty());
       std::unique_ptr<IPC::Message> response_msg(
@@ -228,25 +210,9 @@
   const int process_id_;
   std::vector<std::unique_ptr<IPC::Message>> queued_messages_;
   base::AtomicSequenceNumber next_routing_id_;
-  scoped_refptr<MockMessagePortMessageFilter> message_filter_;
   scoped_refptr<MockSharedWorkerMessageFilter> worker_filter_;
 };
 
-void CreateMessagePortPair(MockRendererProcessHost* renderer,
-                           int* route_1,
-                           int* port_1,
-                           int* route_2,
-                           int* port_2) {
-  EXPECT_TRUE(renderer->OnMessageReceived(
-      new MessagePortHostMsg_CreateMessagePort(route_1, port_1)));
-  EXPECT_TRUE(renderer->OnMessageReceived(
-      new MessagePortHostMsg_CreateMessagePort(route_2, port_2)));
-  EXPECT_TRUE(renderer->OnMessageReceived(
-      new MessagePortHostMsg_Entangle(*port_1, *port_2)));
-  EXPECT_TRUE(renderer->OnMessageReceived(
-      new MessagePortHostMsg_Entangle(*port_2, *port_1)));
-}
-
 void PostCreateWorker(MockRendererProcessHost* renderer,
                       const std::string& url,
                       const std::string& name,
@@ -269,61 +235,31 @@
 class MockSharedWorkerConnector {
  public:
   MockSharedWorkerConnector(MockRendererProcessHost* renderer_host)
-      : renderer_host_(renderer_host),
-        temporary_remote_port_route_id_(0),
-        remote_port_id_(0),
-        local_port_route_id_(0),
-        local_port_id_(0) {}
+      : renderer_host_(renderer_host) {}
   void Create(const std::string& url,
               const std::string& name,
               unsigned long long document_id,
               int render_frame_route_id) {
-    CreateMessagePortPair(renderer_host_,
-                          &temporary_remote_port_route_id_,
-                          &remote_port_id_,
-                          &local_port_route_id_,
-                          &local_port_id_);
     PostCreateWorker(renderer_host_, url, name, document_id,
                      render_frame_route_id, &create_worker_reply_);
   }
-  void SendQueueMessages() {
-    EXPECT_TRUE(renderer_host_->OnMessageReceived(
-        new MessagePortHostMsg_QueueMessages(remote_port_id_)));
-  }
-  void SendPostMessage(const std::string& data) {
-    const std::vector<int> empty_ports;
-    EXPECT_TRUE(
-        renderer_host_->OnMessageReceived(new MessagePortHostMsg_PostMessage(
-            local_port_id_, base::ASCIIToUTF16(data), empty_ports)));
-  }
   void SendConnect() {
+    mojo::MessagePipe message_pipe;
+    local_port_ = MessagePort(std::move(message_pipe.handle0));
+
     EXPECT_TRUE(
         renderer_host_->OnMessageReceived(new ViewHostMsg_ConnectToWorker(
-            create_worker_reply_.route_id, remote_port_id_)));
+            create_worker_reply_.route_id,
+            MessagePort(std::move(message_pipe.handle1)))));
   }
-  void SendSendQueuedMessages(
-      const std::vector<QueuedMessage>& queued_messages) {
-    EXPECT_TRUE(renderer_host_->OnMessageReceived(
-        new MessagePortHostMsg_SendQueuedMessages(remote_port_id_,
-                                                  queued_messages)));
-  }
-  int temporary_remote_port_route_id() {
-    return temporary_remote_port_route_id_;
-  }
-  int remote_port_id() { return remote_port_id_; }
-  int local_port_route_id() { return local_port_route_id_; }
-  int local_port_id() { return local_port_id_; }
+  MessagePort local_port() { return local_port_; }
   int route_id() { return create_worker_reply_.route_id; }
   blink::WebWorkerCreationError creation_error() {
     return create_worker_reply_.error;
   }
-
  private:
   MockRendererProcessHost* renderer_host_;
-  int temporary_remote_port_route_id_;
-  int remote_port_id_;
-  int local_port_route_id_;
-  int local_port_id_;
+  MessagePort local_port_;
   ViewHostMsg_CreateWorker_Reply create_worker_reply_;
 };
 
@@ -363,37 +299,17 @@
   EXPECT_EQ(expected_feature, feature);
 }
 
-void CheckMessagePortMsgMessagesQueued(MockRendererProcessHost* renderer_host,
-                                       MockSharedWorkerConnector* connector) {
-  std::unique_ptr<IPC::Message> msg(renderer_host->PopMessage());
-  EXPECT_EQ(MessagePortMsg_MessagesQueued::ID, msg->type());
-  EXPECT_EQ(connector->temporary_remote_port_route_id(), msg->routing_id());
-}
-
 void CheckWorkerMsgConnect(MockRendererProcessHost* renderer_host,
                            int expected_msg_route_id,
-                           int expected_sent_message_port_id,
-                           int* routing_id) {
+                           int* connection_request_id,
+                           MessagePort* port) {
   std::unique_ptr<IPC::Message> msg(renderer_host->PopMessage());
   EXPECT_EQ(WorkerMsg_Connect::ID, msg->type());
   EXPECT_EQ(expected_msg_route_id, msg->routing_id());
   WorkerMsg_Connect::Param params;
   EXPECT_TRUE(WorkerMsg_Connect::Read(msg.get(), &params));
-  int port_id = std::get<0>(params);
-  *routing_id = std::get<1>(params);
-  EXPECT_EQ(expected_sent_message_port_id, port_id);
-}
-
-void CheckMessagePortMsgMessage(MockRendererProcessHost* renderer_host,
-                                int expected_msg_route_id,
-                                std::string expected_data) {
-  std::unique_ptr<IPC::Message> msg(renderer_host->PopMessage());
-  EXPECT_EQ(MessagePortMsg_Message::ID, msg->type());
-  EXPECT_EQ(expected_msg_route_id, msg->routing_id());
-  MessagePortMsg_Message::Param params;
-  EXPECT_TRUE(MessagePortMsg_Message::Read(msg.get(), &params));
-  base::string16 data = std::get<0>(params);
-  EXPECT_EQ(base::ASCIIToUTF16(expected_data), data);
+  *connection_request_id = std::get<0>(params);
+  *port = std::get<1>(params);
 }
 
 void CheckViewMsgWorkerConnected(MockRendererProcessHost* renderer_host,
@@ -418,15 +334,12 @@
   std::unique_ptr<MockSharedWorkerConnector> connector(
       new MockSharedWorkerConnector(renderer_host.get()));
   int worker_route_id;
-  int worker_msg_port_route_id;
 
-  // SharedWorkerConnector creates two message ports and sends
-  // ViewHostMsg_CreateWorker.
+  // Sends ViewHostMsg_CreateWorker.
   connector->Create("http://example.com/w.js",
                     "name",
                     kDocumentIDs[0],
                     kRenderFrameRouteIDs[0]);
-  // We need to go to UI thread to call ReserveRenderProcessOnUI().
   RunAllPendingInMessageLoop();
   EXPECT_EQ(2U, renderer_host->QueuedMessageCount());
   // WorkerProcessMsg_CreateWorker should be sent to the renderer in which
@@ -439,29 +352,15 @@
   // ViewMsg_WorkerCreated(1) should be sent back to SharedWorkerConnector side.
   CheckViewMsgWorkerCreated(renderer_host.get(), connector.get());
 
-  // SharedWorkerConnector side sends MessagePortHostMsg_QueueMessages in
-  // WebSharedWorkerProxy::connect.
-  connector->SendQueueMessages();
-  EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
-  // MessagePortMsg_MessagesQueued(2) should be sent back to
-  // SharedWorkerConnector side.
-  CheckMessagePortMsgMessagesQueued(renderer_host.get(), connector.get());
-
   // When SharedWorkerConnector receives ViewMsg_WorkerCreated(1), it sends
-  // WorkerMsg_Connect wrapped in ViewHostMsg_ForwardToWorker.
+  // WorkerMsg_Connect via ViewHostMsg_ConnectToWorker.
   connector->SendConnect();
   EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
   // WorkerMsg_Connect should be sent to SharedWorker side.
-  CheckWorkerMsgConnect(renderer_host.get(),
-                        worker_route_id,
-                        connector->remote_port_id(),
-                        &worker_msg_port_route_id);
-
-  // When SharedWorkerConnector receives MessagePortMsg_MessagesQueued(2), it
-  // sends MessagePortHostMsg_SendQueuedMessages.
-  std::vector<QueuedMessage> empty_messages;
-  connector->SendSendQueuedMessages(empty_messages);
-  EXPECT_EQ(0U, renderer_host->QueuedMessageCount());
+  int worker_msg_connection_request_id;
+  MessagePort worker_msg_port;
+  CheckWorkerMsgConnect(renderer_host.get(), worker_route_id,
+                        &worker_msg_connection_request_id, &worker_msg_port);
 
   // SharedWorker sends WorkerHostMsg_WorkerReadyForInspection in
   // EmbeddedSharedWorkerStub::WorkerReadyForInspection().
@@ -479,29 +378,19 @@
   // EmbeddedSharedWorkerStub::workerScriptLoaded().
   EXPECT_TRUE(
       renderer_host->OnMessageReceived(new WorkerHostMsg_WorkerConnected(
-          connector->remote_port_id(), worker_route_id)));
+          worker_msg_connection_request_id, worker_route_id)));
   EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
   // ViewMsg_WorkerConnected should be sent to SharedWorkerConnector side.
   CheckViewMsgWorkerConnected(renderer_host.get(), connector.get(),
                               std::set<uint32_t>());
 
-  // When SharedWorkerConnector side sends MessagePortHostMsg_PostMessage,
-  // SharedWorker side shuold receive MessagePortMsg_Message.
-  connector->SendPostMessage("test1");
-  EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
-  CheckMessagePortMsgMessage(
-      renderer_host.get(), worker_msg_port_route_id, "test1");
-
-  // When SharedWorker side sends MessagePortHostMsg_PostMessage,
-  // SharedWorkerConnector side shuold receive MessagePortMsg_Message.
-  const std::vector<int> empty_ports;
-  EXPECT_TRUE(
-      renderer_host->OnMessageReceived(new MessagePortHostMsg_PostMessage(
-          connector->remote_port_id(),
-          base::ASCIIToUTF16("test2"), empty_ports)));
-  EXPECT_EQ(1U, renderer_host->QueuedMessageCount());
-  CheckMessagePortMsgMessage(
-      renderer_host.get(), connector->local_port_route_id(), "test2");
+  // Verify that |worker_msg_port| corresponds to |connector->local_port()|.
+  base::string16 expected_message(base::ASCIIToUTF16("test1"));
+  connector->local_port().PostMessage(expected_message,
+                                      std::vector<MessagePort>());
+  base::string16 received_message;
+  BlockingReadFromMessagePort(worker_msg_port, &received_message);
+  EXPECT_EQ(expected_message, received_message);
 
   // SharedWorker sends WorkerHostMsg_CountFeature in
   // EmbeddedSharedWorkerStub::CountFeature().
@@ -538,15 +427,12 @@
   std::unique_ptr<MockSharedWorkerConnector> connector0(
       new MockSharedWorkerConnector(renderer_host0.get()));
   int worker_route_id;
-  int worker_msg_port_route_id1;
 
-  // SharedWorkerConnector creates two message ports and sends
-  // ViewHostMsg_CreateWorker.
+  // Sends ViewHostMsg_CreateWorker.
   connector0->Create("http://example.com/w.js",
                      "name",
                      kDocumentIDs[0],
                      kRenderFrameRouteIDs[0]);
-  // We need to go to UI thread to call ReserveRenderProcessOnUI().
   RunAllPendingInMessageLoop();
   EXPECT_EQ(2U, renderer_host0->QueuedMessageCount());
   // WorkerProcessMsg_CreateWorker should be sent to the renderer in which
@@ -559,29 +445,15 @@
   // ViewMsg_WorkerCreated(1) should be sent back to SharedWorkerConnector side.
   CheckViewMsgWorkerCreated(renderer_host0.get(), connector0.get());
 
-  // SharedWorkerConnector side sends MessagePortHostMsg_QueueMessages in
-  // WebSharedWorkerProxy::connect.
-  connector0->SendQueueMessages();
-  EXPECT_EQ(1U, renderer_host0->QueuedMessageCount());
-  // MessagePortMsg_MessagesQueued(2) should be sent back to
-  // SharedWorkerConnector side.
-  CheckMessagePortMsgMessagesQueued(renderer_host0.get(), connector0.get());
-
   // When SharedWorkerConnector receives ViewMsg_WorkerCreated(1), it sends
   // WorkerMsg_Connect wrapped in ViewHostMsg_ForwardToWorker.
   connector0->SendConnect();
   EXPECT_EQ(1U, renderer_host0->QueuedMessageCount());
   // WorkerMsg_Connect should be sent to SharedWorker side.
-  CheckWorkerMsgConnect(renderer_host0.get(),
-                        worker_route_id,
-                        connector0->remote_port_id(),
-                        &worker_msg_port_route_id1);
-
-  // When SharedWorkerConnector receives MessagePortMsg_MessagesQueued(2), it
-  // sends MessagePortHostMsg_SendQueuedMessages.
-  std::vector<QueuedMessage> empty_messages;
-  connector0->SendSendQueuedMessages(empty_messages);
-  EXPECT_EQ(0U, renderer_host0->QueuedMessageCount());
+  int worker_msg_connection_request_id1;
+  MessagePort worker_msg_port1;
+  CheckWorkerMsgConnect(renderer_host0.get(), worker_route_id,
+                        &worker_msg_connection_request_id1, &worker_msg_port1);
 
   // SharedWorker sends WorkerHostMsg_WorkerReadyForInspection in
   // EmbeddedSharedWorkerStub::WorkerReadyForInspection().
@@ -599,29 +471,19 @@
   // EmbeddedSharedWorkerStub::workerScriptLoaded().
   EXPECT_TRUE(
       renderer_host0->OnMessageReceived(new WorkerHostMsg_WorkerConnected(
-          connector0->remote_port_id(), worker_route_id)));
+          worker_msg_connection_request_id1, worker_route_id)));
   EXPECT_EQ(1U, renderer_host0->QueuedMessageCount());
   // ViewMsg_WorkerConnected should be sent to SharedWorkerConnector side.
   CheckViewMsgWorkerConnected(renderer_host0.get(), connector0.get(),
                               std::set<uint32_t>());
 
-  // When SharedWorkerConnector side sends MessagePortHostMsg_PostMessage,
-  // SharedWorker side shuold receive MessagePortMsg_Message.
-  connector0->SendPostMessage("test1");
-  EXPECT_EQ(1U, renderer_host0->QueuedMessageCount());
-  CheckMessagePortMsgMessage(
-      renderer_host0.get(), worker_msg_port_route_id1, "test1");
-
-  // When SharedWorker side sends MessagePortHostMsg_PostMessage,
-  // SharedWorkerConnector side shuold receive MessagePortMsg_Message.
-  const std::vector<int> empty_ports;
-  EXPECT_TRUE(
-      renderer_host0->OnMessageReceived(new MessagePortHostMsg_PostMessage(
-          connector0->remote_port_id(),
-          base::ASCIIToUTF16("test2"), empty_ports)));
-  EXPECT_EQ(1U, renderer_host0->QueuedMessageCount());
-  CheckMessagePortMsgMessage(
-      renderer_host0.get(), connector0->local_port_route_id(), "test2");
+  // Verify that |worker_msg_port1| corresponds to |connector0->local_port()|.
+  base::string16 expected_message1(base::ASCIIToUTF16("test1"));
+  connector0->local_port().PostMessage(expected_message1,
+                                       std::vector<MessagePort>());
+  base::string16 received_message1;
+  BlockingReadFromMessagePort(worker_msg_port1, &received_message1);
+  EXPECT_EQ(expected_message1, received_message1);
 
   // SharedWorker sends WorkerHostMsg_CountFeature in
   // EmbeddedSharedWorkerStub::CountFeature().
@@ -645,7 +507,6 @@
                                   *partition_.get()));
   std::unique_ptr<MockSharedWorkerConnector> connector1(
       new MockSharedWorkerConnector(renderer_host1.get()));
-  int worker_msg_port_route_id2;
 
   // UpdateWorkerDependency should not be called yet.
   EXPECT_EQ(0, s_update_worker_dependency_call_count_);
@@ -668,55 +529,33 @@
   EXPECT_EQ(kProcessIDs[0], s_worker_dependency_added_ids_[0]);
   EXPECT_EQ(0U, s_worker_dependency_removed_ids_.size());
 
-  // SharedWorkerConnector side sends MessagePortHostMsg_QueueMessages in
-  // WebSharedWorkerProxy::connect.
-  connector1->SendQueueMessages();
-  EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
-  // MessagePortMsg_MessagesQueued(4) should be sent back to
-  // SharedWorkerConnector side.
-  CheckMessagePortMsgMessagesQueued(renderer_host1.get(), connector1.get());
-
   // When SharedWorkerConnector receives ViewMsg_WorkerCreated(3), it sends
   // WorkerMsg_Connect wrapped in ViewHostMsg_ForwardToWorker.
   connector1->SendConnect();
   EXPECT_EQ(1U, renderer_host0->QueuedMessageCount());
   // WorkerMsg_Connect should be sent to SharedWorker side.
-  CheckWorkerMsgConnect(renderer_host0.get(),
-                        worker_route_id,
-                        connector1->remote_port_id(),
-                        &worker_msg_port_route_id2);
-
-  // When SharedWorkerConnector receives MessagePortMsg_MessagesQueued(4), it
-  // sends MessagePortHostMsg_SendQueuedMessages.
-  connector1->SendSendQueuedMessages(empty_messages);
-  EXPECT_EQ(0U, renderer_host1->QueuedMessageCount());
+  int worker_msg_connection_request_id2;
+  MessagePort worker_msg_port2;
+  CheckWorkerMsgConnect(renderer_host0.get(), worker_route_id,
+                        &worker_msg_connection_request_id2, &worker_msg_port2);
 
   // SharedWorker sends WorkerHostMsg_WorkerConnected in
   // EmbeddedSharedWorkerStub::OnConnect().
   EXPECT_TRUE(
       renderer_host0->OnMessageReceived(new WorkerHostMsg_WorkerConnected(
-          connector1->remote_port_id(), worker_route_id)));
+          worker_msg_connection_request_id2, worker_route_id)));
   EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
   // ViewMsg_WorkerConnected should be sent to SharedWorkerConnector side.
   CheckViewMsgWorkerConnected(renderer_host1.get(), connector1.get(),
                               {feature1, feature2});
 
-  // When SharedWorkerConnector side sends MessagePortHostMsg_PostMessage,
-  // SharedWorker side shuold receive MessagePortMsg_Message.
-  connector1->SendPostMessage("test3");
-  EXPECT_EQ(1U, renderer_host0->QueuedMessageCount());
-  CheckMessagePortMsgMessage(
-      renderer_host0.get(), worker_msg_port_route_id2, "test3");
-
-  // When SharedWorker side sends MessagePortHostMsg_PostMessage,
-  // SharedWorkerConnector side shuold receive MessagePortMsg_Message.
-  EXPECT_TRUE(
-      renderer_host0->OnMessageReceived(new MessagePortHostMsg_PostMessage(
-          connector1->remote_port_id(),
-          base::ASCIIToUTF16("test4"), empty_ports)));
-  EXPECT_EQ(1U, renderer_host1->QueuedMessageCount());
-  CheckMessagePortMsgMessage(
-      renderer_host1.get(), connector1->local_port_route_id(), "test4");
+  // Verify that |worker_msg_port2| corresponds to |connector1->local_port()|.
+  base::string16 expected_message2(base::ASCIIToUTF16("test2"));
+  connector1->local_port().PostMessage(expected_message2,
+                                       std::vector<MessagePort>());
+  base::string16 received_message2;
+  BlockingReadFromMessagePort(worker_msg_port2, &received_message2);
+  EXPECT_EQ(expected_message2, received_message2);
 
   // SharedWorker sends WorkerHostMsg_CountFeature in
   // EmbeddedSharedWorkerStub::CountFeature(). These used_features are already
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc
index c373a20..52c4520 100644
--- a/content/browser/web_contents/web_contents_android.cc
+++ b/content/browser/web_contents/web_contents_android.cc
@@ -29,7 +29,6 @@
 #include "content/common/frame_messages.h"
 #include "content/common/input_messages.h"
 #include "content/common/view_messages.h"
-#include "content/public/browser/android/app_web_message_port_service.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/message_port_provider.h"
@@ -574,24 +573,9 @@
     const JavaParamRef<jstring>& jmessage,
     const JavaParamRef<jstring>& jsource_origin,
     const JavaParamRef<jstring>& jtarget_origin,
-    const JavaParamRef<jintArray>& jsent_ports) {
-  base::string16 source_origin(ConvertJavaStringToUTF16(env, jsource_origin));
-  base::string16 target_origin(ConvertJavaStringToUTF16(env, jtarget_origin));
-  base::string16 message(ConvertJavaStringToUTF16(env, jmessage));
-  std::vector<int> ports;
-
-  if (!jsent_ports.is_null())
-    base::android::JavaIntArrayToIntVector(env, jsent_ports, &ports);
+    const JavaParamRef<jobjectArray>& jports) {
   content::MessagePortProvider::PostMessageToFrame(
-      web_contents_, source_origin, target_origin, message, ports);
-}
-
-void WebContentsAndroid::CreateMessageChannel(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    const JavaParamRef<jobjectArray>& ports) {
-  content::MessagePortProvider::GetAppWebMessagePortService()
-      ->CreateMessageChannel(env, ports, web_contents_);
+      web_contents_, env, jsource_origin, jtarget_origin, jmessage, jports);
 }
 
 jboolean WebContentsAndroid::HasAccessedInitialDocument(
diff --git a/content/browser/web_contents/web_contents_android.h b/content/browser/web_contents/web_contents_android.h
index 1cafa20..d31ba28 100644
--- a/content/browser/web_contents/web_contents_android.h
+++ b/content/browser/web_contents/web_contents_android.h
@@ -138,12 +138,7 @@
       const base::android::JavaParamRef<jstring>& jmessage,
       const base::android::JavaParamRef<jstring>& jsource_origin,
       const base::android::JavaParamRef<jstring>& jtarget_origin,
-      const base::android::JavaParamRef<jintArray>& jsent_ports);
-
-  void CreateMessageChannel(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      const base::android::JavaParamRef<jobjectArray>& ports);
+      const base::android::JavaParamRef<jobjectArray>& jports);
 
   jboolean HasAccessedInitialDocument(
       JNIEnv* env,
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 1b28eb47e..e32a11e2f 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -65,7 +65,6 @@
 #include "content/browser/media/capture/web_contents_audio_muter.h"
 #include "content/browser/media/media_web_contents_observer.h"
 #include "content/browser/media/session/media_session_impl.h"
-#include "content/browser/message_port_message_filter.h"
 #include "content/browser/plugin_content_origin_whitelist.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
 #include "content/browser/renderer_host/render_view_host_delegate_view.h"
diff --git a/content/child/blob_storage/blob_transport_controller.cc b/content/child/blob_storage/blob_transport_controller.cc
index 1b01792..4f6d145 100644
--- a/content/child/blob_storage/blob_transport_controller.cc
+++ b/content/child/blob_storage/blob_transport_controller.cc
@@ -181,6 +181,10 @@
                  base::Unretained(BlobTransportController::GetInstance()), uuid,
                  base::Passed(std::move(consolidation)),
                  base::Passed(std::move(main_runner))));
+
+  // Measure how much jank the following synchronous IPC introduces.
+  SCOPED_UMA_HISTOGRAM_TIMER("Storage.Blob.RegisterBlobTime");
+
   sender->Send(
       new BlobStorageMsg_RegisterBlob(uuid, content_type, "", descriptions));
 }
diff --git a/content/child/blob_storage/blob_transport_controller_unittest.cc b/content/child/blob_storage/blob_transport_controller_unittest.cc
index 249da17..c016777 100644
--- a/content/child/blob_storage/blob_transport_controller_unittest.cc
+++ b/content/child/blob_storage/blob_transport_controller_unittest.cc
@@ -133,7 +133,8 @@
     ASSERT_TRUE(register_message);
     std::tuple<std::string, std::string, std::string, std::vector<DataElement>>
         register_contents;
-    BlobStorageMsg_RegisterBlob::Read(register_message, &register_contents);
+    BlobStorageMsg_RegisterBlob::ReadSendParam(register_message,
+                                               &register_contents);
     EXPECT_EQ(expected_uuid, std::get<0>(register_contents));
     EXPECT_EQ(expected_content_type, std::get<1>(register_contents));
     if (descriptions)
diff --git a/content/child/blob_storage/webblobregistry_impl.cc b/content/child/blob_storage/webblobregistry_impl.cc
index a1ef5be..5032ed1 100644
--- a/content/child/blob_storage/webblobregistry_impl.cc
+++ b/content/child/blob_storage/webblobregistry_impl.cc
@@ -12,6 +12,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/shared_memory.h"
 #include "base/message_loop/message_loop.h"
+#include "base/metrics/histogram_macros.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/trace_event/trace_event.h"
 #include "content/child/blob_storage/blob_consolidation.h"
@@ -111,6 +112,9 @@
 
 void WebBlobRegistryImpl::registerPublicBlobURL(const WebURL& url,
                                                 const WebString& uuid) {
+  // Measure how much jank the following synchronous IPC introduces.
+  SCOPED_UMA_HISTOGRAM_TIMER("Storage.Blob.RegisterPublicURLTime");
+
   sender_->Send(new BlobHostMsg_RegisterPublicURL(url, uuid.utf8()));
 }
 
diff --git a/content/child/service_worker/service_worker_dispatcher.cc b/content/child/service_worker/service_worker_dispatcher.cc
index a3ffdf6..80166e1 100644
--- a/content/child/service_worker/service_worker_dispatcher.cc
+++ b/content/child/service_worker/service_worker_dispatcher.cc
@@ -877,13 +877,11 @@
   }
 
   blink::WebMessagePortChannelArray ports =
-      WebMessagePortChannelImpl::CreatePorts(
-          params.message_ports, params.new_routing_ids,
-          base::ThreadTaskRunnerHandle::Get());
+      WebMessagePortChannelImpl::CreateFromMessagePorts(params.message_ports);
 
   found->second->dispatchMessageEvent(
       WebServiceWorkerImpl::CreateHandle(worker),
-      blink::WebString::fromUTF16(params.message), ports);
+      blink::WebString::fromUTF16(params.message), std::move(ports));
 }
 
 void ServiceWorkerDispatcher::OnCountFeature(int thread_id,
diff --git a/content/child/service_worker/service_worker_dispatcher_unittest.cc b/content/child/service_worker/service_worker_dispatcher_unittest.cc
index 0f9b789a..ae0f55e 100644
--- a/content/child/service_worker/service_worker_dispatcher_unittest.cc
+++ b/content/child/service_worker/service_worker_dispatcher_unittest.cc
@@ -138,7 +138,7 @@
   void dispatchMessageEvent(
       std::unique_ptr<blink::WebServiceWorker::Handle> handle,
       const blink::WebString& message,
-      const blink::WebMessagePortChannelArray& channels) override {
+      blink::WebMessagePortChannelArray channels) override {
     // WebPassOwnPtr cannot be owned in Chromium, so drop the handle here.
     // The destruction releases ServiceWorkerHandleReference.
     is_dispatch_message_event_called_ = true;
diff --git a/content/child/service_worker/web_service_worker_impl.cc b/content/child/service_worker/web_service_worker_impl.cc
index 947359eb..216e2c2 100644
--- a/content/child/service_worker/web_service_worker_impl.cc
+++ b/content/child/service_worker/web_service_worker_impl.cc
@@ -43,18 +43,6 @@
   DISALLOW_COPY_AND_ASSIGN(HandleImpl);
 };
 
-void SendPostMessageToWorkerOnMainThread(
-    ThreadSafeSender* thread_safe_sender,
-    int handle_id,
-    int provider_id,
-    const base::string16& message,
-    const url::Origin& source_origin,
-    std::unique_ptr<WebMessagePortChannelArray> channels) {
-  thread_safe_sender->Send(new ServiceWorkerHostMsg_PostMessageToWorker(
-      handle_id, provider_id, message, source_origin,
-      WebMessagePortChannelImpl::ExtractMessagePortIDs(std::move(channels))));
-}
-
 }  // namespace
 
 WebServiceWorkerImpl::WebServiceWorkerImpl(
@@ -101,26 +89,14 @@
     blink::WebServiceWorkerProvider* provider,
     const WebString& message,
     const WebSecurityOrigin& source_origin,
-    WebMessagePortChannelArray* channels) {
-  WebServiceWorkerProviderImpl* provider_impl =
-      static_cast<WebServiceWorkerProviderImpl*>(provider);
-  ServiceWorkerDispatcher* dispatcher =
-      ServiceWorkerDispatcher::GetThreadSpecificInstance();
-  DCHECK(dispatcher);
-
-  // This may send channels for MessagePorts, and all internal book-keeping
-  // messages for MessagePort (e.g. QueueMessages) are sent from main thread
-  // (with thread hopping), so we need to do the same thread hopping here not
-  // to overtake those messages.
-  dispatcher->main_thread_task_runner()->PostTask(
-      FROM_HERE,
-      base::Bind(&SendPostMessageToWorkerOnMainThread,
-                 base::RetainedRef(thread_safe_sender_),
-                 handle_ref_->handle_id(), provider_impl->provider_id(),
-                 // We convert WebString to string16 before crossing
-                 // threads for thread-safety.
-                 message.utf16(), url::Origin(source_origin),
-                 base::Passed(base::WrapUnique(channels))));
+    WebMessagePortChannelArray channels) {
+  thread_safe_sender_->Send(
+      new ServiceWorkerHostMsg_PostMessageToWorker(
+          handle_ref_->handle_id(),
+          static_cast<WebServiceWorkerProviderImpl*>(provider)->provider_id(),
+          message.utf16(),
+          url::Origin(source_origin),
+          WebMessagePortChannelImpl::ExtractMessagePorts(std::move(channels))));
 }
 
 void WebServiceWorkerImpl::terminate() {
diff --git a/content/child/service_worker/web_service_worker_impl.h b/content/child/service_worker/web_service_worker_impl.h
index 80ecb9e..cdcea15a 100644
--- a/content/child/service_worker/web_service_worker_impl.h
+++ b/content/child/service_worker/web_service_worker_impl.h
@@ -50,7 +50,7 @@
   void postMessage(blink::WebServiceWorkerProvider* provider,
                    const blink::WebString& message,
                    const blink::WebSecurityOrigin& source_origin,
-                   blink::WebMessagePortChannelArray* channels) override;
+                   blink::WebMessagePortChannelArray channels) override;
   void terminate() override;
 
   // Creates WebServiceWorker::Handle object that owns a reference to the given
diff --git a/content/child/webmessageportchannel_impl.cc b/content/child/webmessageportchannel_impl.cc
index 26de409..3c5e8d9 100644
--- a/content/child/webmessageportchannel_impl.cc
+++ b/content/child/webmessageportchannel_impl.cc
@@ -5,16 +5,12 @@
 #include "content/child/webmessageportchannel_impl.h"
 
 #include <stddef.h>
-#include <utility>
 
 #include "base/bind.h"
-#include "content/child/child_process.h"
-#include "content/child/child_thread_impl.h"
-#include "content/common/message_port_messages.h"
+#include "base/logging.h"
+#include "base/memory/ptr_util.h"
 #include "third_party/WebKit/public/platform/WebMessagePortChannelClient.h"
 #include "third_party/WebKit/public/platform/WebString.h"
-#include "third_party/WebKit/public/web/WebSerializedScriptValue.h"
-#include "v8/include/v8.h"
 
 using blink::WebMessagePortChannel;
 using blink::WebMessagePortChannelArray;
@@ -23,303 +19,109 @@
 
 namespace content {
 
-WebMessagePortChannelImpl::WebMessagePortChannelImpl(
-    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread_task_runner)
-    : client_(NULL),
-      route_id_(MSG_ROUTING_NONE),
-      message_port_id_(MSG_ROUTING_NONE),
-      main_thread_task_runner_(main_thread_task_runner) {
-  AddRef();
-  Init();
-}
-
-WebMessagePortChannelImpl::WebMessagePortChannelImpl(
-    int route_id,
-    int port_id,
-    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread_task_runner)
-    : client_(NULL),
-      route_id_(route_id),
-      message_port_id_(port_id),
-      main_thread_task_runner_(main_thread_task_runner) {
-  AddRef();
-  Init();
-}
-
 WebMessagePortChannelImpl::~WebMessagePortChannelImpl() {
-  // If we have any queued messages with attached ports, manually destroy them.
-  while (!message_queue_.empty()) {
-    const WebMessagePortChannelArray& channel_array =
-        message_queue_.front().ports;
-    for (size_t i = 0; i < channel_array.size(); i++) {
-      channel_array[i]->destroy();
-    }
-    message_queue_.pop();
-  }
+  setClient(nullptr);
+}
 
-  if (message_port_id_ != MSG_ROUTING_NONE)
-    Send(new MessagePortHostMsg_DestroyMessagePort(message_port_id_));
-
-  if (route_id_ != MSG_ROUTING_NONE)
-    ChildThreadImpl::current()->GetRouter()->RemoveRoute(route_id_);
+WebMessagePortChannelImpl::WebMessagePortChannelImpl(
+    MessagePort message_port)
+    : port_(message_port.ReleaseHandle()) {
 }
 
 // static
 void WebMessagePortChannelImpl::CreatePair(
-    const scoped_refptr<base::SingleThreadTaskRunner>& main_thread_task_runner,
     blink::WebMessagePortChannel** channel1,
     blink::WebMessagePortChannel** channel2) {
-  WebMessagePortChannelImpl* impl1 =
-      new WebMessagePortChannelImpl(main_thread_task_runner);
-  WebMessagePortChannelImpl* impl2 =
-      new WebMessagePortChannelImpl(main_thread_task_runner);
-
-  impl1->Entangle(impl2);
-  impl2->Entangle(impl1);
-
-  *channel1 = impl1;
-  *channel2 = impl2;
+  mojo::MessagePipe pipe;
+  *channel1 = new WebMessagePortChannelImpl(std::move(pipe.handle0));
+  *channel2 = new WebMessagePortChannelImpl(std::move(pipe.handle1));
 }
 
 // static
-std::vector<int>
-WebMessagePortChannelImpl::ExtractMessagePortIDs(
-    std::unique_ptr<WebMessagePortChannelArray> channels) {
-  std::vector<int> message_ports;
-  if (channels)
-    message_ports = ExtractMessagePortIDs(*channels);
-  return message_ports;
-}
-
-// static
-std::vector<int>
-WebMessagePortChannelImpl::ExtractMessagePortIDs(
-    const WebMessagePortChannelArray& channels) {
-  std::vector<int> message_ports(channels.size());
+std::vector<MessagePort>
+WebMessagePortChannelImpl::ExtractMessagePorts(
+    WebMessagePortChannelArray channels) {
+  std::vector<MessagePort> message_ports(channels.size());
   for (size_t i = 0; i < channels.size(); ++i) {
-    WebMessagePortChannelImpl* webchannel =
-        static_cast<WebMessagePortChannelImpl*>(channels[i]);
-    // The message port ids might not be set up yet if this channel
-    // wasn't created on the main thread.
-    DCHECK(webchannel->main_thread_task_runner_->BelongsToCurrentThread());
-    message_ports[i] = webchannel->message_port_id();
-    webchannel->QueueMessages();
-    DCHECK(message_ports[i] != MSG_ROUTING_NONE);
+    WebMessagePortChannelImpl* channel_impl =
+        static_cast<WebMessagePortChannelImpl*>(channels[i].get());
+    message_ports[i] = channel_impl->ReleaseMessagePort();
+    DCHECK(message_ports[i].GetHandle().is_valid());
   }
   return message_ports;
 }
 
 // static
-std::vector<int>
-WebMessagePortChannelImpl::ExtractMessagePortIDsWithoutQueueing(
-    std::unique_ptr<WebMessagePortChannelArray> channels) {
-  if (!channels)
-    return std::vector<int>();
-
-  std::vector<int> message_ports(channels->size());
-  for (size_t i = 0; i < channels->size(); ++i) {
-    WebMessagePortChannelImpl* webchannel =
-        static_cast<WebMessagePortChannelImpl*>((*channels)[i]);
-    // The message port ids might not be set up yet if this channel
-    // wasn't created on the main thread.
-    DCHECK(webchannel->main_thread_task_runner_->BelongsToCurrentThread());
-    message_ports[i] = webchannel->message_port_id();
-    // Don't queue messages, but do increase the child processes ref-count to
-    // ensure this child process stays alive long enough to receive all
-    // in-flight messages.
-    ChildProcess::current()->AddRefProcess();
-    DCHECK(message_ports[i] != MSG_ROUTING_NONE);
-  }
-  return message_ports;
-}
-
-// static
-WebMessagePortChannelArray WebMessagePortChannelImpl::CreatePorts(
-    const std::vector<int>& message_ports,
-    const std::vector<int>& new_routing_ids,
-    const scoped_refptr<base::SingleThreadTaskRunner>&
-        main_thread_task_runner) {
-  DCHECK_EQ(message_ports.size(), new_routing_ids.size());
+WebMessagePortChannelArray
+WebMessagePortChannelImpl::CreateFromMessagePorts(
+    const std::vector<MessagePort>& message_ports) {
   WebMessagePortChannelArray channels(message_ports.size());
-  for (size_t i = 0; i < message_ports.size() && i < new_routing_ids.size();
-       ++i) {
-    channels[i] = new WebMessagePortChannelImpl(
-        new_routing_ids[i], message_ports[i],
-        main_thread_task_runner);
+  for (size_t i = 0; i < message_ports.size(); ++i)
+    channels[i] = base::MakeUnique<WebMessagePortChannelImpl>(message_ports[i]);
+  return channels;
+}
+
+// static
+WebMessagePortChannelArray
+WebMessagePortChannelImpl::CreateFromMessagePipeHandles(
+    std::vector<mojo::ScopedMessagePipeHandle> handles) {
+  WebMessagePortChannelArray channels(handles.size());
+  for (size_t i = 0; i < handles.size(); ++i) {
+    channels[i] = base::MakeUnique<WebMessagePortChannelImpl>(
+        MessagePort(std::move(handles[i])));
   }
   return channels;
 }
 
-void WebMessagePortChannelImpl::setClient(WebMessagePortChannelClient* client) {
-  // Must lock here since client_ is called on the main thread.
-  base::AutoLock auto_lock(lock_);
-  client_ = client;
+MessagePort WebMessagePortChannelImpl::ReleaseMessagePort() {
+  return MessagePort(port_.ReleaseHandle());
 }
 
-void WebMessagePortChannelImpl::destroy() {
-  setClient(NULL);
+WebMessagePortChannelImpl::WebMessagePortChannelImpl(
+    mojo::ScopedMessagePipeHandle handle)
+    : port_(std::move(handle)) {
+}
 
-  // Release the object on the main thread, since the destructor might want to
-  // send an IPC, and that has to happen on the main thread.
-  main_thread_task_runner_->ReleaseSoon(FROM_HERE, this);
+void WebMessagePortChannelImpl::setClient(WebMessagePortChannelClient* client) {
+  if (client) {
+    port_.SetCallback(
+        base::Bind(&WebMessagePortChannelClient::messageAvailable,
+                   base::Unretained(client)));
+  } else {
+    port_.ClearCallback();
+  }
 }
 
 void WebMessagePortChannelImpl::postMessage(
-    const WebString& message,
-    WebMessagePortChannelArray* channels_ptr) {
-  std::unique_ptr<WebMessagePortChannelArray> channels(channels_ptr);
-  if (!main_thread_task_runner_->BelongsToCurrentThread()) {
-    // Note: we must construct the base::string16 here and pass that. Otherwise,
-    // the WebString will be passed, leading to references to the StringImpl
-    // from two threads, which is a data race.
-    main_thread_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&WebMessagePortChannelImpl::SendPostMessage, this,
-                              base::Passed(message.utf16()),
-                              base::Passed(std::move(channels))));
-  } else {
-    SendPostMessage(message.utf16(), std::move(channels));
+    const WebString& encoded_message,
+    WebMessagePortChannelArray channels) {
+  std::vector<MessagePort> ports;
+  if (!channels.isEmpty()) {
+    ports.resize(channels.size());
+    for (size_t i = 0; i < channels.size(); ++i) {
+      ports[i] = static_cast<WebMessagePortChannelImpl*>(channels[i].get())->
+          ReleaseMessagePort();
+    }
   }
-}
-
-void WebMessagePortChannelImpl::SendPostMessage(
-    const base::string16& message,
-    std::unique_ptr<WebMessagePortChannelArray> channels) {
-  IPC::Message* msg = new MessagePortHostMsg_PostMessage(
-      message_port_id_, message, ExtractMessagePortIDs(std::move(channels)));
-  Send(msg);
+  port_.PostMessage(encoded_message.utf16(), std::move(ports));
 }
 
 bool WebMessagePortChannelImpl::tryGetMessage(
-    WebString* message,
+    WebString* encoded_message,
     WebMessagePortChannelArray& channels) {
-  base::AutoLock auto_lock(lock_);
-  if (message_queue_.empty())
+  base::string16 buffer;
+  std::vector<MessagePort> ports;
+  if (!port_.GetMessage(&buffer, &ports))
     return false;
 
-  *message = WebString::fromUTF16(message_queue_.front().message);
-  channels = message_queue_.front().ports;
-  message_queue_.pop();
+  *encoded_message = WebString::fromUTF16(buffer);
+
+  if (!ports.empty()) {
+    channels = WebMessagePortChannelArray(ports.size());
+    for (size_t i = 0; i < ports.size(); ++i)
+      channels[i] = base::MakeUnique<WebMessagePortChannelImpl>(ports[i]);
+  }
   return true;
 }
 
-void WebMessagePortChannelImpl::Init() {
-  if (!main_thread_task_runner_->BelongsToCurrentThread()) {
-    main_thread_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&WebMessagePortChannelImpl::Init, this));
-    return;
-  }
-
-  if (route_id_ == MSG_ROUTING_NONE) {
-    DCHECK(message_port_id_ == MSG_ROUTING_NONE);
-    Send(new MessagePortHostMsg_CreateMessagePort(
-        &route_id_, &message_port_id_));
-  } else if (message_port_id_ != MSG_ROUTING_NONE) {
-    Send(new MessagePortHostMsg_ReleaseMessages(message_port_id_));
-  }
-
-  ChildThreadImpl::current()->GetRouter()->AddRoute(route_id_, this);
-}
-
-void WebMessagePortChannelImpl::Entangle(
-    scoped_refptr<WebMessagePortChannelImpl> channel) {
-  // The message port ids might not be set up yet, if this channel wasn't
-  // created on the main thread.  So need to wait until we're on the main thread
-  // before getting the other message port id.
-  if (!main_thread_task_runner_->BelongsToCurrentThread()) {
-    main_thread_task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(&WebMessagePortChannelImpl::Entangle, this, channel));
-    return;
-  }
-
-  Send(new MessagePortHostMsg_Entangle(
-      message_port_id_, channel->message_port_id()));
-}
-
-void WebMessagePortChannelImpl::QueueMessages() {
-  if (!main_thread_task_runner_->BelongsToCurrentThread()) {
-    main_thread_task_runner_->PostTask(
-        FROM_HERE, base::Bind(&WebMessagePortChannelImpl::QueueMessages, this));
-    return;
-  }
-  // This message port is being sent elsewhere (perhaps to another process).
-  // The new endpoint needs to receive the queued messages, including ones that
-  // could still be in-flight.  So we tell the browser to queue messages, and it
-  // sends us an ack, whose receipt we know means that no more messages are
-  // in-flight.  We then send the queued messages to the browser, which prepends
-  // them to the ones it queued and it sends them to the new endpoint.
-  Send(new MessagePortHostMsg_QueueMessages(message_port_id_));
-
-  // The process could potentially go away while we're still waiting for
-  // in-flight messages.  Ensure it stays alive.
-  ChildProcess::current()->AddRefProcess();
-}
-
-void WebMessagePortChannelImpl::Send(IPC::Message* message) {
-  if (!main_thread_task_runner_->BelongsToCurrentThread()) {
-    DCHECK(!message->is_sync());
-    main_thread_task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(&WebMessagePortChannelImpl::Send, this, message));
-    return;
-  }
-
-  ChildThreadImpl::current()->GetRouter()->Send(message);
-}
-
-bool WebMessagePortChannelImpl::OnMessageReceived(const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(WebMessagePortChannelImpl, message)
-    IPC_MESSAGE_HANDLER(MessagePortMsg_Message, OnMessage)
-    IPC_MESSAGE_HANDLER(MessagePortMsg_MessagesQueued, OnMessagesQueued)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-  return handled;
-}
-
-void WebMessagePortChannelImpl::OnMessage(
-    const base::string16& message,
-    const std::vector<int>& sent_message_ports,
-    const std::vector<int>& new_routing_ids) {
-  base::AutoLock auto_lock(lock_);
-  Message msg;
-  msg.message = message;
-  msg.ports = CreatePorts(sent_message_ports, new_routing_ids,
-                          main_thread_task_runner_.get());
-
-  bool was_empty = message_queue_.empty();
-  message_queue_.push(msg);
-  if (client_ && was_empty)
-    client_->messageAvailable();
-}
-
-void WebMessagePortChannelImpl::OnMessagesQueued() {
-  std::vector<QueuedMessage> queued_messages;
-
-  {
-    base::AutoLock auto_lock(lock_);
-    queued_messages.reserve(message_queue_.size());
-    while (!message_queue_.empty()) {
-      base::string16 message = message_queue_.front().message;
-      std::vector<int> ports =
-          ExtractMessagePortIDs(message_queue_.front().ports);
-      queued_messages.push_back(std::make_pair(message, ports));
-      message_queue_.pop();
-    }
-  }
-
-  Send(new MessagePortHostMsg_SendQueuedMessages(
-      message_port_id_, queued_messages));
-
-  message_port_id_ = MSG_ROUTING_NONE;
-
-  Release();
-  ChildProcess::current()->ReleaseProcess();
-}
-
-WebMessagePortChannelImpl::Message::Message() {}
-
-WebMessagePortChannelImpl::Message::Message(const Message& other) = default;
-
-WebMessagePortChannelImpl::Message::~Message() {}
-
 }  // namespace content
diff --git a/content/child/webmessageportchannel_impl.h b/content/child/webmessageportchannel_impl.h
index 6fa60806..70a04b17 100644
--- a/content/child/webmessageportchannel_impl.h
+++ b/content/child/webmessageportchannel_impl.h
@@ -6,120 +6,47 @@
 #define CONTENT_CHILD_WEBMESSAGEPORTCHANNEL_IMPL_H_
 
 #include <memory>
-#include <queue>
 #include <vector>
 
 #include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/string16.h"
-#include "base/synchronization/lock.h"
-#include "ipc/ipc_listener.h"
+#include "content/common/message_port.h"
 #include "third_party/WebKit/public/platform/WebMessagePortChannel.h"
 
-namespace base {
-class SingleThreadTaskRunner;
-}
-
 namespace content {
 
 // This is thread safe.
-class WebMessagePortChannelImpl
-    : public blink::WebMessagePortChannel,
-      public IPC::Listener,
-      public base::RefCountedThreadSafe<WebMessagePortChannelImpl> {
+class WebMessagePortChannelImpl : public blink::WebMessagePortChannel {
  public:
-  explicit WebMessagePortChannelImpl(
-      const scoped_refptr<base::SingleThreadTaskRunner>&
-          main_thread_task_runner);
-  WebMessagePortChannelImpl(
-      int route_id,
-      int port_id,
-      const scoped_refptr<base::SingleThreadTaskRunner>&
-          main_thread_task_runner);
+  ~WebMessagePortChannelImpl() override;
+  explicit WebMessagePortChannelImpl(MessagePort message_port);
 
-  static void CreatePair(
-      const scoped_refptr<base::SingleThreadTaskRunner>&
-          main_thread_task_runner,
-      blink::WebMessagePortChannel** channel1,
-      blink::WebMessagePortChannel** channel2);
+  static void CreatePair(blink::WebMessagePortChannel** channel1,
+                         blink::WebMessagePortChannel** channel2);
 
-  // Extracts port IDs for passing on to the browser process, and queues any
-  // received messages.
-  static std::vector<int> ExtractMessagePortIDs(
-      std::unique_ptr<blink::WebMessagePortChannelArray> channels);
+  // Extracts MessagePorts for passing on to other processes.
+  static std::vector<MessagePort> ExtractMessagePorts(
+      blink::WebMessagePortChannelArray channels);
 
-  // Extracts port IDs for passing on to the browser process, and queues any
-  // received messages.
-  static std::vector<int> ExtractMessagePortIDs(
-      const blink::WebMessagePortChannelArray& channels);
+  // Creates WebMessagePortChannelImpl instances for MessagePorts passed in from
+  // other processes.
+  static blink::WebMessagePortChannelArray CreateFromMessagePorts(
+      const std::vector<MessagePort>& message_ports);
+  static blink::WebMessagePortChannelArray CreateFromMessagePipeHandles(
+      std::vector<mojo::ScopedMessagePipeHandle> handles);
 
-  // Extracts port IDs for passing on to the browser process, but doesn't
-  // send a separate IPC to the browser to initiate queueing messages. Instead
-  // calling code is responsible for initiating the queueing in the browser
-  // process. This is useful when transfering ports over an IPC channel that
-  // does not share ordering guarentees with regular IPC.
-  static std::vector<int>
-  ExtractMessagePortIDsWithoutQueueing(
-      std::unique_ptr<blink::WebMessagePortChannelArray> channels);
-
-  // Creates WebMessagePortChannelImpl instances for port IDs passed in from the
-  // browser process.
-  static blink::WebMessagePortChannelArray CreatePorts(
-      const std::vector<int>& message_ports,
-      const std::vector<int>& new_routing_ids,
-      const scoped_refptr<base::SingleThreadTaskRunner>&
-          main_thread_task_runner);
-
-  // Queues received and incoming messages until there are no more in-flight
-  // messages, then sends all of them to the browser process.
-  void QueueMessages();
-  int message_port_id() const { return message_port_id_; }
+  MessagePort ReleaseMessagePort();
 
  private:
-  friend class base::RefCountedThreadSafe<WebMessagePortChannelImpl>;
-  ~WebMessagePortChannelImpl() override;
+  explicit WebMessagePortChannelImpl(mojo::ScopedMessagePipeHandle handle);
 
   // WebMessagePortChannel implementation.
   void setClient(blink::WebMessagePortChannelClient* client) override;
-  void destroy() override;
-  void postMessage(const blink::WebString& message,
-                   blink::WebMessagePortChannelArray* channels_ptr) override;
-  bool tryGetMessage(blink::WebString* message,
+  void postMessage(const blink::WebString& encoded_message,
+                   blink::WebMessagePortChannelArray channels) override;
+  bool tryGetMessage(blink::WebString* encoded_message,
                      blink::WebMessagePortChannelArray& channels) override;
 
-  void Init();
-  void Entangle(scoped_refptr<WebMessagePortChannelImpl> channel);
-  void Send(IPC::Message* message);
-  void SendPostMessage(
-      const base::string16& message,
-      std::unique_ptr<blink::WebMessagePortChannelArray> channels);
-
-  // IPC::Listener implementation.
-  bool OnMessageReceived(const IPC::Message& message) override;
-
-  void OnMessage(const base::string16& message,
-                 const std::vector<int>& sent_message_ports,
-                 const std::vector<int>& new_routing_ids);
-  void OnMessagesQueued();
-
-  struct Message {
-    Message();
-    Message(const Message& other);
-    ~Message();
-
-    base::string16 message;
-    blink::WebMessagePortChannelArray ports;
-  };
-
-  typedef std::queue<Message> MessageQueue;
-  MessageQueue message_queue_;
-
-  blink::WebMessagePortChannelClient* client_;
-  base::Lock lock_;  // Locks access to above.
-
-  int route_id_;  // The routing id for this object.
-  int message_port_id_;  // A globally unique identifier for this message port.
-  scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
+  MessagePort port_;
 
   DISALLOW_COPY_AND_ASSIGN(WebMessagePortChannelImpl);
 };
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index dbc58dc..6ccbdd5c 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -43,7 +43,6 @@
     "android/sync_compositor_messages.h",
     "android/sync_compositor_statics.cc",
     "android/sync_compositor_statics.h",
-    "app_web_message_port_messages.h",
     "appcache_interfaces.cc",
     "appcache_interfaces.h",
     "appcache_messages.h",
@@ -210,7 +209,8 @@
     "media/surface_view_manager_messages_android.h",
     "media/video_capture.h",
     "memory_messages.h",
-    "message_port_messages.h",
+    "message_port.cc",
+    "message_port.h",
     "navigation_gesture.h",
     "navigation_params.cc",
     "navigation_params.h",
diff --git a/content/common/app_web_message_port_messages.h b/content/common/app_web_message_port_messages.h
deleted file mode 100644
index 145f63b..0000000
--- a/content/common/app_web_message_port_messages.h
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Multiply-included file, no traditional include guard.
-#include <vector>
-
-#include "content/common/content_export.h"
-#include "ipc/ipc_message_macros.h"
-
-#undef IPC_MESSAGE_EXPORT
-#define IPC_MESSAGE_EXPORT CONTENT_EXPORT
-#define IPC_MESSAGE_START AwMessagePortMsgStart
-
-//-----------------------------------------------------------------------------
-// MessagePort messages
-// These are messages sent from the browser to the renderer process.
-
-// Normally the postmessages are exchanged between the renderers and the message
-// itself is opaque to the browser process. The format of the message is a
-// WebSerializesScriptValue.  A WebSerializedScriptValue is a blink structure
-// and can only be serialized/deserialized in renderer. Further, we could not
-// have Blink or V8 on the browser side due to their relience on static
-// variables.
-//
-// For posting messages from Java (Android apps) to JS, we pass the
-// browser/renderer boundary an extra time and convert the messages to a type
-// that browser can use. Within the current implementation specificications,
-// where we use the main frame on the browser side and it always stays within
-// the same process this is not expensive, but if we can do the conversion at
-// the browser, then we can drop this code.
-
-// Important Note about multi-process situation: In a multi-process scenario,
-// the renderer that does the conversion can be theoretically different then the
-// renderer that receives the message. Although in the current implementation
-// this doesn't become an issue, there are 2 possible solutions to deal with
-// this and make the overall system more robust to future changes:
-// 1. Do the conversion at the browser side by writing a new serializer
-// deserializer for WebSerializedScriptValue
-// 2. Do the conversion at the content layer, at the renderer at the time of
-// receiving the message. This may need adding new flags to indicate that
-// message needs to be converted. However, this is complicated due to queing
-// at the browser side and possibility of ports being shipped to a different
-// renderer or browser delegate.
-
-// Tells the renderer to convert the message from a WebSerializeScript
-// format to a base::ListValue. This IPC is used for messages that are
-// incoming to Android apps from JS.
-IPC_MESSAGE_ROUTED3(AppWebMessagePortMsg_WebToAppMessage,
-                    int /* recipient message port id */,
-                    base::string16 /* message */,
-                    std::vector<int> /* sent message port_ids */)
-
-// Tells the renderer to convert the message from a String16
-// format to a WebSerializedScriptValue. This IPC is used for messages that
-// are outgoing from Android apps to JS.
-// TODO(sgurun) when we start supporting other types, use a ListValue instead
-// of string16
-IPC_MESSAGE_ROUTED3(AppWebMessagePortMsg_AppToWebMessage,
-                    int /* recipient message port id */,
-                    base::string16 /* message */,
-                    std::vector<int> /* sent message port_ids */)
-
-// Used to defer message port closing until after all in-flight messages
-// are flushed from renderer to browser. Renderer piggy-backs the message
-// to browser.
-IPC_MESSAGE_ROUTED1(AppWebMessagePortMsg_ClosePort, int /* message port id */)
-
-//-----------------------------------------------------------------------------
-// These are messages sent from the renderer to the browser process.
-
-// Response to AppWebMessagePortMessage_WebToAppMessage
-IPC_MESSAGE_ROUTED3(AppWebMessagePortHostMsg_ConvertedWebToAppMessage,
-                    int /* recipient message port id */,
-                    base::ListValue /* converted message */,
-                    std::vector<int> /* sent message port_ids */)
-
-// Response to AppWebMessagePortMessage_AppToWebMessage
-IPC_MESSAGE_ROUTED3(AppWebMessagePortHostMsg_ConvertedAppToWebMessage,
-                    int /* recipient message port id */,
-                    base::string16 /* converted message */,
-                    std::vector<int> /* sent message port_ids */)
-
-// Response to AppWebMessagePortMsg_ClosePort
-IPC_MESSAGE_ROUTED1(AppWebMessagePortHostMsg_ClosePortAck,
-                    int /* message port id */)
diff --git a/content/common/content_message_generator.h b/content/common/content_message_generator.h
index fe18ad8..fdc4030 100644
--- a/content/common/content_message_generator.h
+++ b/content/common/content_message_generator.h
@@ -32,7 +32,6 @@
 #include "content/common/media/midi_messages.h"
 #include "content/common/media/peer_connection_tracker_messages.h"
 #include "content/common/memory_messages.h"
-#include "content/common/message_port_messages.h"
 #include "content/common/page_messages.h"
 #include "content/common/platform_notification_messages.h"
 #include "content/common/push_messaging_messages.h"
@@ -55,7 +54,6 @@
 
 #if defined(OS_ANDROID)
 #include "content/common/android/sync_compositor_messages.h"
-#include "content/common/app_web_message_port_messages.h"
 #include "content/common/gin_java_bridge_messages.h"
 #include "content/common/media/media_player_messages_android.h"
 #include "content/common/media/surface_view_manager_messages_android.h"
diff --git a/content/common/content_param_traits.cc b/content/common/content_param_traits.cc
index d38e931..2960f787 100644
--- a/content/common/content_param_traits.cc
+++ b/content/common/content_param_traits.cc
@@ -7,6 +7,8 @@
 #include <stddef.h>
 
 #include "base/strings/string_number_conversions.h"
+#include "content/common/message_port.h"
+#include "ipc/ipc_mojo_param_traits.h"
 #include "net/base/ip_endpoint.h"
 #include "ui/events/blink/web_input_event_traits.h"
 
@@ -62,6 +64,31 @@
   l->append(")");
 }
 
+void ParamTraits<content::MessagePort>::GetSize(base::PickleSizer* s,
+                                                const param_type& p) {
+  ParamTraits<mojo::MessagePipeHandle>::GetSize(s, p.GetHandle().get());
+}
+
+void ParamTraits<content::MessagePort>::Write(base::Pickle* m,
+                                              const param_type& p) {
+  ParamTraits<mojo::MessagePipeHandle>::Write(m, p.ReleaseHandle().release());
+}
+
+bool ParamTraits<content::MessagePort>::Read(
+    const base::Pickle* m,
+    base::PickleIterator* iter,
+    param_type* r) {
+  mojo::MessagePipeHandle handle;
+  if (!ParamTraits<mojo::MessagePipeHandle>::Read(m, iter, &handle))
+    return false;
+  *r = content::MessagePort(mojo::ScopedMessagePipeHandle(handle));
+  return true;
+}
+
+void ParamTraits<content::MessagePort>::Log(const param_type& p,
+                                            std::string* l) {
+}
+
 }  // namespace IPC
 
 // Generate param traits size methods.
diff --git a/content/common/content_param_traits.h b/content/common/content_param_traits.h
index 5ce29da..c20b75d 100644
--- a/content/common/content_param_traits.h
+++ b/content/common/content_param_traits.h
@@ -18,6 +18,10 @@
 #include "content/common/cursors/webcursor.h"
 #include "third_party/WebKit/public/platform/WebInputEvent.h"
 
+namespace content {
+class MessagePort;
+}
+
 namespace IPC {
 
 template <>
@@ -47,6 +51,16 @@
   static void Log(const param_type& p, std::string* l);
 };
 
+template <>
+struct CONTENT_EXPORT ParamTraits<content::MessagePort> {
+  typedef content::MessagePort param_type;
+  static void GetSize(base::PickleSizer* sizer, const param_type& p);
+  static void Write(base::Pickle* m, const param_type& p);
+  static bool Read(const base::Pickle* m, base::PickleIterator* iter,
+                   param_type* r);
+  static void Log(const param_type& p, std::string* l);
+};
+
 }  // namespace IPC
 
 #endif  // CONTENT_COMMON_CONTENT_PARAM_TRAITS_H_
diff --git a/content/common/fileapi/webblob_messages.h b/content/common/fileapi/webblob_messages.h
index 3b22b7f..2d1caf2 100644
--- a/content/common/fileapi/webblob_messages.h
+++ b/content/common/fileapi/webblob_messages.h
@@ -54,11 +54,18 @@
 // * 'shortcut' transport the memory up to the IPC limit so the browser can use
 //   it if it's not currently full.
 // See https://bit.ly/BlobStorageRefactor
-IPC_MESSAGE_CONTROL4(BlobStorageMsg_RegisterBlob,
-                     std::string /* uuid */,
-                     std::string /* content_type */,
-                     std::string /* content_disposition */,
-                     std::vector<storage::DataElement> /* item_descriptions */)
+//
+// NOTE: This message is synchronous to ensure that the browser is aware of the
+// UUID before the UUID is passed to another process. This protects against a
+// race condition in which the browser could be asked about a UUID that doesn't
+// yet exist from its perspective. See also https://goo.gl/bfdE64.
+//
+IPC_SYNC_MESSAGE_CONTROL4_0(
+    BlobStorageMsg_RegisterBlob,
+    std::string /* uuid */,
+    std::string /* content_type */,
+    std::string /* content_disposition */,
+    std::vector<storage::DataElement> /* item_descriptions */)
 
 IPC_MESSAGE_CONTROL4(
     BlobStorageMsg_RequestMemoryItem,
@@ -80,9 +87,13 @@
                      std::string /* uuid */)
 IPC_MESSAGE_CONTROL1(BlobHostMsg_DecrementRefCount,
                      std::string /* uuid */)
-IPC_MESSAGE_CONTROL2(BlobHostMsg_RegisterPublicURL,
-                     GURL,
-                     std::string /* uuid */)
+// NOTE: This message is synchronous to ensure that the browser is aware of the
+// UUID before the UUID is passed to another process. This protects against a
+// race condition in which the browser could be asked about a UUID that doesn't
+// yet exist from its perspective. See also https://goo.gl/bfdE64.
+IPC_SYNC_MESSAGE_CONTROL2_0(BlobHostMsg_RegisterPublicURL,
+                            GURL,
+                            std::string /* uuid */)
 IPC_MESSAGE_CONTROL1(BlobHostMsg_RevokePublicURL,
                      GURL)
 
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index e19c6c4..35126af 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -24,6 +24,7 @@
 #include "content/common/frame_message_enums.h"
 #include "content/common/frame_owner_properties.h"
 #include "content/common/frame_replication_state.h"
+#include "content/common/message_port.h"
 #include "content/common/navigation_gesture.h"
 #include "content/common/navigation_params.h"
 #include "content/common/savable_subframe.h"
@@ -321,8 +322,7 @@
   IPC_STRUCT_MEMBER(base::string16, target_origin)
 
   // Information about the MessagePorts this message contains.
-  IPC_STRUCT_MEMBER(std::vector<int>, message_ports)
-  IPC_STRUCT_MEMBER(std::vector<int>, new_routing_ids)
+  IPC_STRUCT_MEMBER(std::vector<content::MessagePort>, message_ports)
 IPC_STRUCT_END()
 
 IPC_STRUCT_TRAITS_BEGIN(content::CommonNavigationParams)
diff --git a/content/common/message_port.cc b/content/common/message_port.cc
new file mode 100644
index 0000000..c89d7b5a
--- /dev/null
+++ b/content/common/message_port.cc
@@ -0,0 +1,186 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/common/message_port.h"
+
+#include "base/logging.h"
+
+namespace content {
+
+MessagePort::~MessagePort() {
+}
+
+MessagePort::MessagePort() : state_(new State()) {
+}
+
+MessagePort::MessagePort(const MessagePort& other) : state_(other.state_) {
+}
+
+MessagePort& MessagePort::operator=(const MessagePort& other) {
+  state_ = other.state_;
+  return *this;
+}
+
+MessagePort::MessagePort(mojo::ScopedMessagePipeHandle handle)
+    : state_(new State(std::move(handle))) {
+}
+
+const mojo::ScopedMessagePipeHandle& MessagePort::GetHandle() const {
+  return state_->handle_;
+}
+
+mojo::ScopedMessagePipeHandle MessagePort::ReleaseHandle() const {
+  state_->CancelWatch();
+  return std::move(state_->handle_);
+}
+
+// static
+std::vector<mojo::ScopedMessagePipeHandle> MessagePort::ReleaseHandles(
+    const std::vector<MessagePort>& ports) {
+  std::vector<mojo::ScopedMessagePipeHandle> handles(ports.size());
+  for (size_t i = 0; i < ports.size(); ++i)
+    handles[i] = ports[i].ReleaseHandle();
+  return handles;
+}
+
+void MessagePort::PostMessage(const base::string16& encoded_message,
+                              std::vector<MessagePort> ports) {
+  DCHECK(state_->handle_.is_valid());
+
+  uint32_t num_bytes = encoded_message.size() * sizeof(base::char16);
+
+  // NOTE: It is OK to ignore the return value of MojoWriteMessage here. HTML
+  // MessagePorts have no way of reporting when the peer is gone.
+
+  if (ports.empty()) {
+    MojoWriteMessage(state_->handle_.get().value(),
+                     encoded_message.data(),
+                     num_bytes,
+                     nullptr,
+                     0,
+                     MOJO_WRITE_MESSAGE_FLAG_NONE);
+  } else {
+    uint32_t num_handles = static_cast<uint32_t>(ports.size());
+    std::unique_ptr<MojoHandle[]> handles(new MojoHandle[num_handles]);
+    for (uint32_t i = 0; i < num_handles; ++i)
+      handles[i] = ports[i].ReleaseHandle().release().value();
+    MojoWriteMessage(state_->handle_.get().value(),
+                     encoded_message.data(),
+                     num_bytes,
+                     handles.get(),
+                     num_handles,
+                     MOJO_WRITE_MESSAGE_FLAG_NONE);
+  }
+}
+
+bool MessagePort::GetMessage(base::string16* encoded_message,
+                             std::vector<MessagePort>* ports) {
+  DCHECK(state_->handle_.is_valid());
+
+  uint32_t num_bytes = 0;
+  uint32_t num_handles = 0;
+
+  MojoResult rv = MojoReadMessage(state_->handle_.get().value(),
+                                  nullptr,
+                                  &num_bytes,
+                                  nullptr,
+                                  &num_handles,
+                                  MOJO_READ_MESSAGE_FLAG_NONE);
+  if (rv == MOJO_RESULT_OK) {
+    encoded_message->clear();
+    ports->clear();
+    return true;
+  }
+  if (rv != MOJO_RESULT_RESOURCE_EXHAUSTED)
+    return false;
+
+  CHECK(num_bytes % 2 == 0);
+
+  base::string16 buffer;
+  buffer.resize(num_bytes / sizeof(base::char16));
+
+  std::unique_ptr<MojoHandle[]> handles;
+  if (num_handles)
+    handles.reset(new MojoHandle[num_handles]);
+
+  rv = MojoReadMessage(state_->handle_.get().value(),
+                       num_bytes ? &buffer[0] : nullptr,
+                       &num_bytes,
+                       handles.get(),
+                       &num_handles,
+                       MOJO_READ_MESSAGE_FLAG_NONE);
+  if (rv != MOJO_RESULT_OK)
+    return false;
+
+  buffer.swap(*encoded_message);
+
+  if (num_handles) {
+    ports->resize(static_cast<size_t>(num_handles));
+    for (uint32_t i = 0; i < num_handles; ++i) {
+      ports->at(i) = MessagePort(
+          mojo::ScopedMessagePipeHandle(mojo::MessagePipeHandle(handles[i])));
+    }
+  }
+  return true;
+}
+
+void MessagePort::SetCallback(const base::Closure& callback) {
+  state_->CancelWatch();
+  state_->callback_ = callback;
+  state_->AddWatch();
+}
+
+void MessagePort::ClearCallback() {
+  state_->CancelWatch();
+  state_->callback_.Reset();
+}
+
+MessagePort::State::State() {
+}
+
+MessagePort::State::State(mojo::ScopedMessagePipeHandle handle)
+    : handle_(std::move(handle)) {
+}
+
+void MessagePort::State::AddWatch() {
+  if (!callback_)
+    return;
+
+  // NOTE: An HTML MessagePort does not receive an event to tell it when the
+  // peer has gone away, so we only watch for readability here.
+  MojoResult rv = MojoWatch(handle_.get().value(),
+                            MOJO_HANDLE_SIGNAL_READABLE,
+                            &MessagePort::State::OnHandleReady,
+                            reinterpret_cast<uintptr_t>(this));
+  if (rv != MOJO_RESULT_OK)
+    DVLOG(1) << this << " MojoWatch failed: " << rv;
+}
+
+void MessagePort::State::CancelWatch() {
+  if (!callback_)
+    return;
+
+  // NOTE: This synchronizes with the thread where OnHandleReady runs so we are
+  // sure to not be racing with it.
+  MojoCancelWatch(handle_.get().value(), reinterpret_cast<uintptr_t>(this));
+}
+
+// static
+void MessagePort::State::OnHandleReady(
+    uintptr_t context,
+    MojoResult result,
+    MojoHandleSignalsState signals_state,
+    MojoWatchNotificationFlags flags) {
+  if (result == MOJO_RESULT_OK) {
+    reinterpret_cast<MessagePort::State*>(context)->callback_.Run();
+  } else {
+    // And now his watch is ended.
+  }
+}
+
+MessagePort::State::~State() {
+  CancelWatch();
+}
+
+}  // namespace content
diff --git a/content/common/message_port.h b/content/common/message_port.h
new file mode 100644
index 0000000..e63d020
--- /dev/null
+++ b/content/common/message_port.h
@@ -0,0 +1,102 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_COMMON_MESSAGE_PORT_H_
+#define CONTENT_COMMON_MESSAGE_PORT_H_
+
+#include <vector>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/strings/string16.h"
+#include "content/common/content_export.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+
+namespace content {
+
+// MessagePort corresponds to a HTML MessagePort. It is a thin wrapper around a
+// Mojo MessagePipeHandle and provides methods for reading and writing messages.
+//
+// A MessagePort is only actively listening for incoming messages once
+// SetCallback has been called with a valid callback. If ClearCallback is
+// called (or if SetCallback is called with a null callback), then the
+// MessagePort will stop listening for incoming messages. The callback runs on
+// an unspecified background thread.
+//
+// Upon destruction, if the MessagePort is listening for incoming messages,
+// then the destructor will first synchronize with the background thread,
+// waiting for it to finish any in-process callback before closing the
+// underlying MessagePipeHandle. This synchronization ensures that any code
+// running in the callback can be sure to not worry about the MessagePort
+// becoming invalid during callback execution.
+//
+// MessagePort methods may be used from any thread; however, care must be taken
+// when using ReleaseHandle, ReleaseHandles or when destroying a MessagePort
+// instance. The MessagePort class does not synchronize those methods with
+// methods like PostMessage, GetMessage and SetCallback that use the underlying
+// MessagePipeHandle.
+//
+// TODO(darin): Make this class move-only once no longer used with Chrome IPC.
+//
+class CONTENT_EXPORT MessagePort {
+ public:
+  ~MessagePort();
+  MessagePort();
+
+  // Shallow copy, resulting in multiple references to the same port.
+  MessagePort(const MessagePort& other);
+  MessagePort& operator=(const MessagePort& other);
+
+  explicit MessagePort(mojo::ScopedMessagePipeHandle handle);
+
+  const mojo::ScopedMessagePipeHandle& GetHandle() const;
+  mojo::ScopedMessagePipeHandle ReleaseHandle() const;
+
+  static std::vector<mojo::ScopedMessagePipeHandle> ReleaseHandles(
+      const std::vector<MessagePort>& ports);
+
+  // Sends an encoded message (along with ports to transfer) to this port's
+  // peer.
+  void PostMessage(const base::string16& encoded_message,
+                   std::vector<MessagePort> ports);
+
+  // Get the next available encoded message if any. Returns true if a message
+  // was read.
+  bool GetMessage(base::string16* encoded_message,
+                  std::vector<MessagePort>* ports);
+
+  // This callback will be invoked on a background thread when messages are
+  // available to be read via GetMessage.
+  void SetCallback(const base::Closure& callback);
+
+  // Clears any callback specified by a prior call to SetCallback.
+  void ClearCallback();
+
+ private:
+  class State : public base::RefCountedThreadSafe<State> {
+   public:
+    State();
+    State(mojo::ScopedMessagePipeHandle handle);
+
+    void AddWatch();
+    void CancelWatch();
+    static void OnHandleReady(uintptr_t context,
+                              MojoResult result,
+                              MojoHandleSignalsState signals_state,
+                              MojoWatchNotificationFlags flags);
+
+    mojo::ScopedMessagePipeHandle handle_;
+    base::Closure callback_;
+
+   private:
+    friend class base::RefCountedThreadSafe<State>;
+    ~State();
+  };
+  mutable scoped_refptr<State> state_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_COMMON_MESSAGE_PORT_H_
diff --git a/content/common/message_port_messages.h b/content/common/message_port_messages.h
deleted file mode 100644
index fa15491..0000000
--- a/content/common/message_port_messages.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Defines messages between the browser and worker process, as well as between
-// the renderer and worker process.
-
-// Multiply-included message file, hence no include guard.
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/strings/string16.h"
-#include "content/common/content_export.h"
-#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_message_utils.h"
-
-#undef IPC_MESSAGE_EXPORT
-#define IPC_MESSAGE_EXPORT CONTENT_EXPORT
-#define IPC_MESSAGE_START MessagePortMsgStart
-
-// Singly-included section for typedefs.
-#ifndef CONTENT_COMMON_MESSAGE_PORT_MESSAGES_H_
-#define CONTENT_COMMON_MESSAGE_PORT_MESSAGES_H_
-
-typedef std::pair<base::string16, std::vector<int>> QueuedMessage;
-
-#endif  // CONTENT_COMMON_MESSAGE_PORT_MESSAGES_H_
-
-//-----------------------------------------------------------------------------
-// MessagePort messages
-// These are messages sent from the browser to child processes.
-
-// Sends a message to a message port.
-IPC_MESSAGE_ROUTED3(
-    MessagePortMsg_Message,
-    base::string16 /* message */,
-    std::vector<int> /* sent_message_ports */,
-    std::vector<int> /* new_routing_ids */)
-
-// Tells the Message Port Channel object that there are no more in-flight
-// messages arriving.
-IPC_MESSAGE_ROUTED0(MessagePortMsg_MessagesQueued)
-
-//-----------------------------------------------------------------------------
-// MessagePortHost messages
-// These are messages sent from child processes to the browser.
-
-// Creates a new Message Port Channel object.  The first paramaeter is the
-// message port channel's routing id in this process.  The second parameter
-// is the process-wide-unique identifier for that port.
-IPC_SYNC_MESSAGE_CONTROL0_2(MessagePortHostMsg_CreateMessagePort,
-                            int /* route_id */,
-                            int /* message_port_id */)
-
-// Sent when a Message Port Channel object is destroyed.
-IPC_MESSAGE_CONTROL1(MessagePortHostMsg_DestroyMessagePort,
-                     int /* message_port_id */)
-
-// Sends a message to a message port.  Optionally sends a message port as
-// as well if sent_message_port_id != MSG_ROUTING_NONE.
-IPC_MESSAGE_CONTROL3(
-    MessagePortHostMsg_PostMessage,
-    int /* sender_message_port_id */,
-    base::string16 /* message */,
-    std::vector<int> /* sent_message_ports */)
-
-// Causes messages sent to the remote port to be delivered to this local port.
-IPC_MESSAGE_CONTROL2(MessagePortHostMsg_Entangle,
-                     int /* local_message_port_id */,
-                     int /* remote_message_port_id */)
-
-// Causes the browser to queue messages sent to this port until the the port
-// has made sure that all in-flight messages were routed to the new
-// destination.
-IPC_MESSAGE_CONTROL1(MessagePortHostMsg_QueueMessages,
-                     int /* message_port_id */)
-
-// Sends the browser all the queued messages that arrived at this message port
-// after it was sent in a postMessage call.
-// NOTE: MSVS can't compile the macro if std::vector<std::pair<string16, int> >
-// is used, so we typedef it in worker_messages.h.
-IPC_MESSAGE_CONTROL2(MessagePortHostMsg_SendQueuedMessages,
-                     int /* message_port_id */,
-                     std::vector<QueuedMessage> /* queued_messages */)
-
-// Tells the browser this message port is ready to receive messages. If the
-// browser was holding messages to this port because no destination for the
-// port was available yet this will cause the browser to release those messages.
-IPC_MESSAGE_CONTROL1(MessagePortHostMsg_ReleaseMessages,
-                     int /* message_port_id */)
diff --git a/content/common/service_worker/service_worker_event_dispatcher.mojom b/content/common/service_worker/service_worker_event_dispatcher.mojom
index 0cce784..2f0b2b6 100644
--- a/content/common/service_worker/service_worker_event_dispatcher.mojom
+++ b/content/common/service_worker/service_worker_event_dispatcher.mojom
@@ -32,8 +32,7 @@
 struct ExtendableMessageEvent {
   mojo.common.mojom.String16 message;
   url.mojom.Origin source_origin;
-  array<int32> message_ports;
-  array<int32> new_routing_ids;
+  array<handle<message_pipe>> message_ports;
   ExtendableMessageEventSource source;
 };
 
diff --git a/content/common/service_worker/service_worker_messages.h b/content/common/service_worker/service_worker_messages.h
index 04f8f61..2fd61407 100644
--- a/content/common/service_worker/service_worker_messages.h
+++ b/content/common/service_worker/service_worker_messages.h
@@ -11,6 +11,7 @@
 
 #include "base/strings/string16.h"
 #include "base/time/time.h"
+#include "content/common/message_port.h"
 #include "content/common/service_worker/service_worker_client_info.h"
 #include "content/common/service_worker/service_worker_status_code.h"
 #include "content/common/service_worker/service_worker_types.h"
@@ -137,8 +138,7 @@
   IPC_STRUCT_MEMBER(int, provider_id)
   IPC_STRUCT_MEMBER(content::ServiceWorkerObjectInfo, service_worker_info)
   IPC_STRUCT_MEMBER(base::string16, message)
-  IPC_STRUCT_MEMBER(std::vector<int>, message_ports)
-  IPC_STRUCT_MEMBER(std::vector<int>, new_routing_ids)
+  IPC_STRUCT_MEMBER(std::vector<content::MessagePort>, message_ports)
 IPC_STRUCT_END()
 
 IPC_STRUCT_TRAITS_BEGIN(content::PushEventPayload)
@@ -214,7 +214,7 @@
     int /* provider_id */,
     base::string16 /* message */,
     url::Origin /* source_origin */,
-    std::vector<int> /* sent_message_ports */)
+    std::vector<content::MessagePort> /* sent_message_ports */)
 
 // Informs the browser of a new ServiceWorkerProvider in the child process,
 // |provider_id| is unique within its child process. When this provider is
@@ -311,7 +311,7 @@
     ServiceWorkerHostMsg_PostMessageToClient,
     std::string /* uuid */,
     base::string16 /* message */,
-    std::vector<int> /* sent_message_ports */)
+    std::vector<content::MessagePort> /* sent_message_ports */)
 
 // ServiceWorker -> Browser message to request that the ServiceWorkerStorage
 // cache |data| associated with |url|.
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 8828d52..9345921 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -20,6 +20,7 @@
 #include "content/common/content_param_traits.h"
 #include "content/common/date_time_suggestion.h"
 #include "content/common/frame_replication_state.h"
+#include "content/common/message_port.h"
 #include "content/common/navigation_gesture.h"
 #include "content/common/resize_params.h"
 #include "content/common/text_input_state.h"
@@ -708,8 +709,8 @@
 // A renderer sends this to the browser process when it wants to connect to a
 // worker.
 IPC_MESSAGE_CONTROL2(ViewHostMsg_ConnectToWorker,
-                     int /* route_id */,
-                     int /* sent_message_port_id */)
+                     int32_t /* worker_route_id */,
+                     content::MessagePort /* port */)
 
 // Tells the browser that a specific Appcache manifest in the current page
 // was accessed.
diff --git a/content/common/worker_messages.h b/content/common/worker_messages.h
index e0405087..c2273a2 100644
--- a/content/common/worker_messages.h
+++ b/content/common/worker_messages.h
@@ -14,6 +14,7 @@
 #include "base/strings/string16.h"
 #include "content/common/content_export.h"
 #include "content/common/content_param_traits.h"
+#include "content/common/message_port.h"
 #include "ipc/ipc_message_macros.h"
 #include "ipc/ipc_message_utils.h"
 #include "url/gurl.h"
@@ -79,8 +80,8 @@
 IPC_MESSAGE_ROUTED0(WorkerMsg_TerminateWorkerContext)
 
 IPC_MESSAGE_ROUTED2(WorkerMsg_Connect,
-                    int /* sent_message_port_id */,
-                    int /* routing_id */)
+                    int /* connection_request_id */,
+                    content::MessagePort /* sent_message_port */)
 
 IPC_MESSAGE_ROUTED0(WorkerMsg_WorkerObjectDestroyed)
 
@@ -115,5 +116,5 @@
                      int /* worker_route_id */)
 
 IPC_MESSAGE_CONTROL2(WorkerHostMsg_WorkerConnected,
-                     int /* message_port_id */,
+                     int /* connection_request_id */,
                      int /* worker_route_id */)
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index b0ed4d2..e1b0a40 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -110,7 +110,6 @@
     "java/src/org/chromium/content/app/SandboxedProcessService8.java",
     "java/src/org/chromium/content/app/SandboxedProcessService9.java",
     "java/src/org/chromium/content/browser/AppWebMessagePort.java",
-    "java/src/org/chromium/content/browser/AppWebMessagePortService.java",
     "java/src/org/chromium/content/browser/ActivityContentVideoViewEmbedder.java",
     "java/src/org/chromium/content/browser/AudioFocusDelegate.java",
     "java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java",
@@ -144,7 +143,6 @@
     "java/src/org/chromium/content/browser/PepperPluginManager.java",
     "java/src/org/chromium/content/browser/PopupZoomer.java",
     "java/src/org/chromium/content/browser/PositionObserver.java",
-    "java/src/org/chromium/content/browser/PostMessageSender.java",
     "java/src/org/chromium/content/browser/RenderCoordinates.java",
     "java/src/org/chromium/content/browser/SPenSupport.java",
     "java/src/org/chromium/content/browser/ScreenOrientationProvider.java",
@@ -225,7 +223,6 @@
     "java/src/org/chromium/content_public/browser/MediaSession.java",
     "java/src/org/chromium/content_public/browser/MediaSessionObserver.java",
     "java/src/org/chromium/content_public/browser/MessagePort.java",
-    "java/src/org/chromium/content_public/browser/MessagePortService.java",
     "java/src/org/chromium/content_public/browser/NavigationController.java",
     "java/src/org/chromium/content_public/browser/NavigationEntry.java",
     "java/src/org/chromium/content_public/browser/NavigationHistory.java",
@@ -318,7 +315,7 @@
   sources = [
     "java/src/org/chromium/content/app/ChildProcessServiceImpl.java",
     "java/src/org/chromium/content/app/ContentMain.java",
-    "java/src/org/chromium/content/browser/AppWebMessagePortService.java",
+    "java/src/org/chromium/content/browser/AppWebMessagePort.java",
     "java/src/org/chromium/content/browser/AudioFocusDelegate.java",
     "java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java",
     "java/src/org/chromium/content/browser/BrowserStartupController.java",
diff --git a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java b/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java
index 30e50d02..17a60d78 100644
--- a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java
+++ b/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePort.java
@@ -9,6 +9,8 @@
 import android.os.Message;
 
 import org.chromium.base.Log;
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
 import org.chromium.content_public.browser.MessagePort;
 
 import java.util.Arrays;
@@ -19,16 +21,6 @@
  *
  * State management:
  *
- * Initially a message port will be in a pending state. It will be ready once it is created in
- * content/ (in IO thread) and a message port id is assigned.
- * A pending message port cannnot be transferred, and cannot send or receive messages. However,
- * these details are hidden from the user. If a message port is in the pending state:
- * 1. Any messages posted in this port will be queued until the port is ready
- * 2. Transferring the port using a message channel will cause the message (and any subsequent
- *    messages sent) to be queued until the port is ready
- * 3. Transferring the pending port via postMessageToFrame will cause the message (and all
- *    subsequent messages posted via postMessageToFrame) to be queued until the port is ready.
- *
  * A message port can be in transferred state while a transfer is pending or complete. An
  * application cannot use a transferred port to post messages. If a transferred port
  * receives messages, they will be queued. This state is not visible to embedder app.
@@ -48,7 +40,7 @@
  * the code below
  *  1.  var c1 = new MessageChannel();
  *  2.  var c2 = new MessageChannel();
- *  3.  c1.port2.onmessage= function(e) { console.log("1"); }
+ *  3.  c1.port2.onmessage = function(e) { console.log("1"); }
  *  4.  c2.port2.onmessage = function(e) {
  *  5.     e.ports[0].onmessage = function(f) {
  *  6.          console.log("3");
@@ -73,25 +65,13 @@
  * transferring data. As a return, it simplifies implementation and prevents hard
  * to debug, racy corner cases while receiving/sending data.
  */
-public class AppWebMessagePort implements MessagePort, PostMessageSender.PostMessageSenderDelegate {
-    private static final String TAG = "MessagePort";
-    private static final int PENDING = -1;
+@JNINamespace("content")
+public class AppWebMessagePort implements MessagePort {
+    private static final String TAG = "AppWebMessagePort";
+    private static final long UNINITIALIZED_PORT_NATIVE_PTR = 0;
 
-    // the what value for POST_MESSAGE
-    private static final int POST_MESSAGE = 1;
-
-    private static class PostMessageFromWeb {
-        public AppWebMessagePort port;
-        public String message;
-        public AppWebMessagePort[] sentPorts;
-
-        public PostMessageFromWeb(
-                AppWebMessagePort port, String message, AppWebMessagePort[] sentPorts) {
-            this.port = port;
-            this.message = message;
-            this.sentPorts = sentPorts;
-        }
-    }
+    // The |what| value for handleMessage.
+    private static final int MESSAGES_AVAILABLE = 1;
 
     // Implements the handler to handle messageport messages received from web.
     // These messages are received on IO thread and normally handled in main
@@ -102,9 +82,9 @@
         }
         @Override
         public void handleMessage(Message msg) {
-            if (msg.what == POST_MESSAGE) {
-                PostMessageFromWeb m = (PostMessageFromWeb) msg.obj;
-                m.port.onMessage(m.message, m.sentPorts);
+            if (msg.what == MESSAGES_AVAILABLE) {
+                AppWebMessagePort port = (AppWebMessagePort) msg.obj;
+                port.dispatchReceivedMessages();
                 return;
             }
             throw new IllegalStateException("undefined message");
@@ -114,35 +94,38 @@
     private static final MessageHandler sDefaultHandler =
             new MessageHandler(Looper.getMainLooper());
 
-    private int mPortId = PENDING;
+    private long mNativeAppWebMessagePort = UNINITIALIZED_PORT_NATIVE_PTR;
     private MessageCallback mMessageCallback;
-    private AppWebMessagePortService mMessagePortService;
     private boolean mClosed;
     private boolean mTransferred;
     private boolean mStarted;
-    private boolean mReleasedMessages;
-    private PostMessageSender mPostMessageSender;
     private MessageHandler mHandler;
     private final Object mLock = new Object();
 
-    public AppWebMessagePort(AppWebMessagePortService messagePortService) {
-        mMessagePortService = messagePortService;
-        mPostMessageSender = new PostMessageSender(this, mMessagePortService);
-        mMessagePortService.addObserver(mPostMessageSender);
+    // Called to create an entangled pair of ports.
+    public static AppWebMessagePort[] createPair() {
+        AppWebMessagePort[] ports =
+            new AppWebMessagePort[] { new AppWebMessagePort(), new AppWebMessagePort() };
+        nativeInitializeAppWebMessagePortPair(ports);
+        return ports;
     }
 
     @Override
     public boolean isReady() {
-        return mPortId != PENDING;
+        return mNativeAppWebMessagePort != UNINITIALIZED_PORT_NATIVE_PTR;
     }
 
-    public int portId() {
-        return mPortId;
+    @CalledByNative
+    private void setNativeAppWebMessagePort(long nativeAppWebMessagePort) {
+        mNativeAppWebMessagePort = nativeAppWebMessagePort;
     }
 
-    public void setPortId(int id) {
-        mPortId = id;
-        releaseMessages();
+    @CalledByNative
+    private long releaseNativePortForTransfer() {
+        mTransferred = true;
+        long port = mNativeAppWebMessagePort;
+        mNativeAppWebMessagePort = UNINITIALIZED_PORT_NATIVE_PTR;
+        return port;
     }
 
     @Override
@@ -150,16 +133,19 @@
         if (mTransferred) {
             throw new IllegalStateException("Port is already transferred");
         }
+        if (mClosed) return;
+        mClosed = true;
+        // Synchronize with dispatchReceivedMessages to ensure that the native
+        // port is not closed too soon, but avoid holding mLock while calling
+        // nativeCloseMessagePort as that could result in a dead-lock (racing
+        // with onMessagesAvailable).
+        long port = UNINITIALIZED_PORT_NATIVE_PTR;
         synchronized (mLock) {
-            if (mClosed) return;
-            mClosed = true;
+            port = mNativeAppWebMessagePort;
+            mNativeAppWebMessagePort = UNINITIALIZED_PORT_NATIVE_PTR;
         }
-        // If the port is already ready, and no messages are waiting in the
-        // queue to be transferred, onPostMessageQueueEmpty() callback is not
-        // received (it is received only after messages are purged). In this
-        // case do the cleanup here.
-        if (isReady() && mPostMessageSender.isMessageQueueEmpty()) {
-            cleanup();
+        if (port != UNINITIALIZED_PORT_NATIVE_PTR) {
+            nativeCloseMessagePort(port);
         }
     }
 
@@ -173,10 +159,6 @@
         return mTransferred;
     }
 
-    public void setTransferred() {
-        mTransferred = true;
-    }
-
     @Override
     public boolean isStarted() {
         return mStarted;
@@ -185,6 +167,9 @@
     // Only called on UI thread
     @Override
     public void setMessageCallback(MessageCallback messageCallback, Handler handler) {
+        if (isClosed() || isTransferred()) {
+            throw new IllegalStateException("Port is already closed or transferred");
+        }
         mStarted = true;
         synchronized (mLock) {
             mMessageCallback = messageCallback;
@@ -192,40 +177,41 @@
                 mHandler = new MessageHandler(handler.getLooper());
             }
         }
-        releaseMessages();
+        nativeStartReceivingMessages(mNativeAppWebMessagePort);
     }
 
-    // Only called on IO thread.
-    public void onReceivedMessage(String message, AppWebMessagePort[] sentPorts) {
+    // Called on a background thread.
+    @CalledByNative
+    private void onMessagesAvailable() {
         synchronized (mLock) {
-            PostMessageFromWeb m = new PostMessageFromWeb(this, message, sentPorts);
             Handler handler = mHandler != null ? mHandler : sDefaultHandler;
-            Message msg = handler.obtainMessage(POST_MESSAGE, m);
+            Message msg = handler.obtainMessage(MESSAGES_AVAILABLE, this);
             handler.sendMessage(msg);
         }
     }
 
-    private void releaseMessages() {
-        if (mReleasedMessages || !isReady() || mMessageCallback == null) {
+    // This method is called by nativeDispatchNextMessage while mLock is held.
+    @CalledByNative
+    private void onReceivedMessage(String message, AppWebMessagePort[] ports) {
+        if (mMessageCallback == null) {
+            Log.w(TAG, "No handler set for port [" + mNativeAppWebMessagePort
+                    + "], dropping message " + message);
             return;
         }
-        mReleasedMessages = true;
-        mMessagePortService.releaseMessages(mPortId);
+        mMessageCallback.onMessage(message, ports);
     }
 
-    // This method may be called on a different thread than UI thread.
-    public void onMessage(String message, AppWebMessagePort[] ports) {
-        synchronized (mLock) {
-            if (isClosed()) {
-                Log.w(TAG, "Port [" + mPortId + "] received message in closed state");
-                return;
+    // This method may be called on either the UI thread or a background thread.
+    private void dispatchReceivedMessages() {
+        // Dispatch all of the available messages unless interrupted by close().
+        // NOTE: nativeDispatchNextMessage returns true and calls onReceivedMessage
+        // if a message is available else it returns false.
+        while (true) {
+            synchronized (mLock) {
+                if (!(isReady() && nativeDispatchNextMessage(mNativeAppWebMessagePort))) {
+                    break;
+                }
             }
-            if (mMessageCallback == null) {
-                Log.w(TAG,
-                        "No handler set for port [" + mPortId + "], dropping message " + message);
-                return;
-            }
-            mMessageCallback.onMessage(message, ports);
         }
     }
 
@@ -240,37 +226,24 @@
                 if (port.equals(this)) {
                     throw new IllegalStateException("Source port cannot be transferred");
                 }
+                if (port.isClosed() || port.isTransferred()) {
+                    throw new IllegalStateException("Port is already closed or transferred");
+                }
+                if (port.isStarted()) {
+                    throw new IllegalStateException("Port is already started");
+                }
             }
             ports = Arrays.copyOf(sentPorts, sentPorts.length, AppWebMessagePort[].class);
         }
         mStarted = true;
-        mPostMessageSender.postMessage(null, message, null, ports);
+        nativePostMessage(mNativeAppWebMessagePort, message, ports);
     }
 
-    // Implements PostMessageSender.PostMessageSenderDelegate interface method.
-    @Override
-    public boolean isPostMessageSenderReady() {
-        return isReady();
-    }
+    private static native void nativeInitializeAppWebMessagePortPair(AppWebMessagePort[] ports);
 
-    // Implements PostMessageSender.PostMessageSenderDelegate interface method.
-    @Override
-    public void onPostMessageQueueEmpty() {
-        if (isClosed()) {
-            cleanup();
-        }
-    }
-
-    // Implements PostMessageSender.PostMessageSenderDelegate interface method.
-    @Override
-    public void postMessageToWeb(
-            String frameName, String message, String targetOrigin, int[] sentPortIds) {
-        mMessagePortService.postMessage(mPortId, message, sentPortIds);
-    }
-
-    private void cleanup() {
-        mMessagePortService.removeObserver(mPostMessageSender);
-        mPostMessageSender = null;
-        mMessagePortService.closePort(mPortId);
-    }
+    private native void nativeCloseMessagePort(long nativeAppWebMessagePort);
+    private native void nativePostMessage(long nativeAppWebMessagePort, String message,
+                                          AppWebMessagePort[] ports);
+    private native boolean nativeDispatchNextMessage(long nativeAppWebMessagePort);
+    private native void nativeStartReceivingMessages(long nativeAppWebMessagePort);
 }
diff --git a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePortService.java b/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePortService.java
deleted file mode 100644
index b908901..0000000
--- a/content/public/android/java/src/org/chromium/content/browser/AppWebMessagePortService.java
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content.browser;
-
-import android.util.SparseArray;
-
-import org.chromium.base.ObserverList;
-import org.chromium.base.ThreadUtils;
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.content_public.browser.MessagePortService;
-
-/**
- * Provides the Message Channel functionality for Android Apps
- * (including WebView embedders and Chrome Custom Tabs clients). Specifically
- * manages the message ports that are associated with a message channel and
- * handles posting/receiving messages to/from them.
- * See https://html.spec.whatwg.org/multipage/comms.html#messagechannel for
- * further information on message channels.
- *
- * The message ports have unique IDs. In Android implementation,
- * the message ports are only known by their IDs at the native side.
- * At the java side, the embedder deals with MessagePort objects. The mapping
- * from an ID to an object is in AppWebMessagePortService. AppWebMessagePortService
- * keeps a strong ref to MessagePort objects until they are closed.
- *
- * Ownership: The Java AppWebMessagePortService has to be owned by Java side global.
- * The native AppWebMessagePortService is a singleton. The
- * native peer maintains a weak ref to the java object and deregisters itself
- * before being deleted.
- *
- * All methods are called on UI thread except as noted.
- */
-@JNINamespace("content")
-public class AppWebMessagePortService implements MessagePortService {
-    private static final String TAG = "AppWebMessagePortService";
-
-    /**
-     * Observer for MessageChannel events.
-     */
-    public static interface MessageChannelObserver { void onMessageChannelCreated(); }
-
-    // A thread safe storage for Message Ports.
-    private static class MessagePortStorage {
-        private SparseArray<AppWebMessagePort> mMessagePorts = new SparseArray<AppWebMessagePort>();
-        private final Object mLock = new Object();
-
-        public void remove(int portId) {
-            synchronized (mLock) {
-                mMessagePorts.remove(portId);
-            }
-        }
-
-        public void put(int portId, AppWebMessagePort m) {
-            synchronized (mLock) {
-                mMessagePorts.put(portId, m);
-            }
-        }
-        public AppWebMessagePort get(int portId) {
-            synchronized (mLock) {
-                return mMessagePorts.get(portId);
-            }
-        }
-    }
-
-    private long mNativeMessagePortService;
-    private MessagePortStorage mPortStorage = new MessagePortStorage();
-    private ObserverList<MessageChannelObserver> mObserverList =
-            new ObserverList<MessageChannelObserver>();
-
-    public AppWebMessagePortService() {
-        mNativeMessagePortService = nativeInitAppWebMessagePortService();
-    }
-
-    public void addObserver(MessageChannelObserver observer) {
-        mObserverList.addObserver(observer);
-    }
-
-    public void removeObserver(MessageChannelObserver observer) {
-        mObserverList.removeObserver(observer);
-    }
-
-    public void closePort(int messagePortId) {
-        mPortStorage.remove(messagePortId);
-        if (mNativeMessagePortService == 0) return;
-        nativeClosePort(mNativeMessagePortService, messagePortId);
-    }
-
-    public void postMessage(int senderId, String message, int[] sentPorts) {
-        // verify that the port is owned by service still (not transferred).
-        if (mPortStorage.get(senderId) == null) {
-            throw new IllegalStateException("Cannot post to unknown port " + senderId);
-        }
-        if (mNativeMessagePortService == 0) return;
-        nativePostAppToWebMessage(mNativeMessagePortService, senderId, message, sentPorts);
-    }
-
-    public void removeSentPorts(int[] sentPorts) {
-        // verify that this service still owns all the ports that are transferred
-        if (sentPorts != null) {
-            for (int port : sentPorts) {
-                AppWebMessagePort p = mPortStorage.get(port);
-                if (p == null) {
-                    throw new IllegalStateException("Cannot transfer unknown port " + port);
-                }
-                mPortStorage.remove(port);
-            }
-        }
-    }
-
-    @Override
-    public AppWebMessagePort[] createMessageChannel() {
-        return new AppWebMessagePort[] {new AppWebMessagePort(this), new AppWebMessagePort(this)};
-    }
-
-    // Called on UI thread.
-    public void releaseMessages(int portId) {
-        if (mNativeMessagePortService == 0) return;
-        nativeReleaseMessages(mNativeMessagePortService, portId);
-    }
-
-    private AppWebMessagePort addPort(AppWebMessagePort m, int portId) {
-        if (mPortStorage.get(portId) != null) {
-            throw new IllegalStateException("Port already exists");
-        }
-        m.setPortId(portId);
-        mPortStorage.put(portId, m);
-        return m;
-    }
-
-    @CalledByNative
-    private void onMessageChannelCreated(int portId1, int portId2, AppWebMessagePort[] ports) {
-        ThreadUtils.assertOnUiThread();
-        addPort(ports[0], portId1);
-        addPort(ports[1], portId2);
-        for (MessageChannelObserver observer : mObserverList) {
-            observer.onMessageChannelCreated();
-        }
-    }
-
-    // Called on IO thread.
-    @CalledByNative
-    private void onReceivedMessage(int portId, String message, int[] ports) {
-        AppWebMessagePort[] messagePorts = null;
-        for (int i = 0; i < ports.length; i++) {
-            if (messagePorts == null) {
-                messagePorts = new AppWebMessagePort[ports.length];
-            }
-            messagePorts[i] = addPort(new AppWebMessagePort(this), ports[i]);
-        }
-        mPortStorage.get(portId).onReceivedMessage(message, messagePorts);
-    }
-
-    @CalledByNative
-    private void unregisterNativeAppWebMessagePortService() {
-        mNativeMessagePortService = 0;
-    }
-
-    private native long nativeInitAppWebMessagePortService();
-    private native void nativePostAppToWebMessage(
-            long nativeAppWebMessagePortServiceImpl, int senderId, String message, int[] portIds);
-    private native void nativeClosePort(long nativeAppWebMessagePortServiceImpl, int messagePortId);
-    private native void nativeReleaseMessages(
-            long nativeAppWebMessagePortServiceImpl, int messagePortId);
-}
diff --git a/content/public/android/java/src/org/chromium/content/browser/PostMessageSender.java b/content/public/android/java/src/org/chromium/content/browser/PostMessageSender.java
deleted file mode 100644
index 9c58e96..0000000
--- a/content/public/android/java/src/org/chromium/content/browser/PostMessageSender.java
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content.browser;
-
-import java.util.ArrayDeque;
-
-/**
- * Sanity checks and sends post messages to web. Queues messages if necessary.
- */
-public class PostMessageSender implements AppWebMessagePortService.MessageChannelObserver {
-    /**
-     * The interface for message handler.
-     */
-    public static interface PostMessageSenderDelegate {
-        /*
-         * Posts a message to the destination frame for real. The unique message port
-         * id of any transferred port should be known at this time.
-         */
-        void postMessageToWeb(
-                String frameName, String message, String targetOrigin, int[] sentPortIds);
-
-        /*
-         * Whether the post message sender is ready to post messages.
-         */
-        boolean isPostMessageSenderReady();
-
-        /*
-         * Informs that all messages are posted and message queue is empty.
-         */
-        void onPostMessageQueueEmpty();
-    }
-    ;
-
-    // A struct to store Message parameters that are sent from App to Web.
-    private static class PostMessageParams {
-        public String frameName;
-        public String message;
-        public String targetOrigin;
-        public AppWebMessagePort[] sentPorts;
-
-        public PostMessageParams(String frameName, String message, String targetOrigin,
-                AppWebMessagePort[] sentPorts) {
-            this.frameName = frameName;
-            this.message = message;
-            this.targetOrigin = targetOrigin;
-            this.sentPorts = sentPorts;
-        }
-    }
-
-    private PostMessageSenderDelegate mDelegate;
-    private AppWebMessagePortService mService;
-
-    // If a message that is sent from android webview to web has a pending port (a port that
-    // is not internally created yet), this message, and any following messages will be
-    // queued until the transferred port becomes ready. This is necessary to prevent any
-    // reordering.
-    private ArrayDeque<PostMessageParams> mMessageQueue = new ArrayDeque<PostMessageParams>();
-
-    public PostMessageSender(PostMessageSenderDelegate delegate, AppWebMessagePortService service) {
-        mDelegate = delegate;
-        mService = service;
-    }
-
-    // TODO(sgurun) in code review it was found this was implemented wrongly
-    // as mMessageQueue.size() > 0. write a test to catch this.
-    public boolean isMessageQueueEmpty() {
-        return mMessageQueue.size() == 0;
-    }
-
-    // Return true if any sent port is pending.
-    private boolean anySentPortIsPending(AppWebMessagePort[] sentPorts) {
-        if (sentPorts != null) {
-            for (AppWebMessagePort port : sentPorts) {
-                if (!port.isReady()) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    // A message to a frame is queued if:
-    // 1. Sender is not ready to post. When posting messages to frames, sender is always
-    // ready. However, when posting messages using message channels, sender may be in
-    // a pending state.
-    // 2. There are already queued messages
-    // 3. The message includes a port that is not ready yet.
-    private boolean shouldQueueMessage(AppWebMessagePort[] sentPorts) {
-        // if messages to frames are already in queue mode, simply queue it, no need to
-        // check ports.
-        if (mMessageQueue.size() > 0 || !mDelegate.isPostMessageSenderReady()) {
-            return true;
-        }
-        if (anySentPortIsPending(sentPorts)) {
-            return true;
-        }
-        return false;
-    }
-
-    private void postMessageToWeb(
-            String frameName, String message, String targetOrigin, AppWebMessagePort[] sentPorts) {
-        int[] portIds = null;
-        if (sentPorts != null) {
-            portIds = new int[sentPorts.length];
-            for (int i = 0; i < sentPorts.length; i++) {
-                portIds[i] = sentPorts[i].portId();
-            }
-            mService.removeSentPorts(portIds);
-        }
-        mDelegate.postMessageToWeb(frameName, message, targetOrigin, portIds);
-    }
-
-    /*
-     * Sanity checks the message and queues it if necessary. Posts the message to delegate
-     * when message can be sent.
-     */
-    public void postMessage(String frameName, String message, String targetOrigin,
-            AppWebMessagePort[] sentPorts) throws IllegalStateException {
-        // Sanity check all the ports that are being transferred.
-        if (sentPorts != null) {
-            for (AppWebMessagePort p : sentPorts) {
-                if (p.isClosed()) {
-                    throw new IllegalStateException("Closed port cannot be transfered");
-                }
-                if (p.isTransferred()) {
-                    throw new IllegalStateException("Port cannot be re-transferred");
-                }
-                if (p.isStarted()) {
-                    throw new IllegalStateException("Started port cannot be transferred");
-                }
-                p.setTransferred();
-            }
-        }
-        if (shouldQueueMessage(sentPorts)) {
-            mMessageQueue.add(new PostMessageParams(frameName, message, targetOrigin, sentPorts));
-        } else {
-            postMessageToWeb(frameName, message, targetOrigin, sentPorts);
-        }
-    }
-
-    /*
-     * Starts posting any messages that are queued.
-     */
-    public void onMessageChannelCreated() {
-        PostMessageParams msg;
-
-        if (!mDelegate.isPostMessageSenderReady()) {
-            return;
-        }
-
-        while ((msg = mMessageQueue.peek()) != null) {
-            // If there are still pending ports, message cannot be posted.
-            if (anySentPortIsPending(msg.sentPorts)) {
-                return;
-            }
-            mMessageQueue.remove();
-            postMessageToWeb(msg.frameName, msg.message, msg.targetOrigin, msg.sentPorts);
-        }
-        mDelegate.onPostMessageQueueEmpty();
-    }
-}
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
index b7dc506..657c9a0 100644
--- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
@@ -19,14 +19,13 @@
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.content.browser.AppWebMessagePort;
-import org.chromium.content.browser.AppWebMessagePortService;
 import org.chromium.content.browser.MediaSessionImpl;
 import org.chromium.content_public.browser.AccessibilitySnapshotCallback;
 import org.chromium.content_public.browser.AccessibilitySnapshotNode;
 import org.chromium.content_public.browser.ContentBitmapCallback;
 import org.chromium.content_public.browser.ImageDownloadCallback;
 import org.chromium.content_public.browser.JavaScriptCallback;
-import org.chromium.content_public.browser.MessagePortService;
+import org.chromium.content_public.browser.MessagePort;
 import org.chromium.content_public.browser.NavigationController;
 import org.chromium.content_public.browser.SmartClipCallback;
 import org.chromium.content_public.browser.WebContents;
@@ -342,17 +341,25 @@
 
     @Override
     public void postMessageToFrame(String frameName, String message,
-            String sourceOrigin, String targetOrigin, int[] sentPortIds) {
-        nativePostMessageToFrame(mNativeWebContentsAndroid, frameName, message,
-                sourceOrigin, targetOrigin, sentPortIds);
+            String sourceOrigin, String targetOrigin, MessagePort[] ports) {
+        if (ports != null) {
+            for (MessagePort port : ports) {
+                if (port.isClosed() || port.isTransferred()) {
+                    throw new IllegalStateException("Port is already closed or transferred");
+                }
+                if (port.isStarted()) {
+                    throw new IllegalStateException("Port is already started");
+                }
+            }
+        }
+        nativePostMessageToFrame(
+                mNativeWebContentsAndroid, frameName, message, sourceOrigin, targetOrigin, ports);
     }
 
     @Override
-    public AppWebMessagePort[] createMessageChannel(MessagePortService service)
+    public AppWebMessagePort[] createMessageChannel()
             throws IllegalStateException {
-        AppWebMessagePort[] ports = ((AppWebMessagePortService) service).createMessageChannel();
-        nativeCreateMessageChannel(mNativeWebContentsAndroid, ports);
-        return ports;
+        return AppWebMessagePort.createPair();
     }
 
     @Override
@@ -579,9 +586,7 @@
     private native void nativeAddMessageToDevToolsConsole(
             long nativeWebContentsAndroid, int level, String message);
     private native void nativePostMessageToFrame(long nativeWebContentsAndroid, String frameName,
-            String message, String sourceOrigin, String targetOrigin, int[] sentPortIds);
-    private native void nativeCreateMessageChannel(
-            long nativeWebContentsAndroid, AppWebMessagePort[] ports);
+            String message, String sourceOrigin, String targetOrigin, MessagePort[] ports);
     private native boolean nativeHasAccessedInitialDocument(
             long nativeWebContentsAndroid);
     private native int nativeGetThemeColor(long nativeWebContentsAndroid);
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/MessagePortService.java b/content/public/android/java/src/org/chromium/content_public/browser/MessagePortService.java
deleted file mode 100644
index 8982b21..0000000
--- a/content/public/android/java/src/org/chromium/content_public/browser/MessagePortService.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.content_public.browser;
-
-/**
- * An interface for creating and managing channels with {@link MessagePort}s on both ends.
- */
-public interface MessagePortService {
-    /**
-     * @return Two {@link MessagePort}s that forms the ends of a message channel created. The user
-     *         of the API should send one of these to the main frame of the tab that should be
-     *         receiving the messages and hold onto the other one.
-     */
-    MessagePort[] createMessageChannel();
-}
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
index 904c05f..3e5332e 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
@@ -270,7 +270,7 @@
      * Dispatches a Message event to the specified frame.
      */
     void postMessageToFrame(String frameName, String message,
-            String sourceOrigin, String targetOrigin, int[] sentPortIds);
+            String sourceOrigin, String targetOrigin, MessagePort[] ports);
 
     /**
      * Creates a message channel for sending postMessage requests and returns the ports for
@@ -278,7 +278,7 @@
      * @param service The message port service to register the channel with.
      * @return The ports that forms the ends of the message channel created.
      */
-    MessagePort[] createMessageChannel(MessagePortService service);
+    MessagePort[] createMessageChannel();
 
     /**
      * Returns whether the initial empty page has been accessed by a script from another
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index 66a608b..92660a8 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -22,7 +22,6 @@
   visibility = [ "//content/*" ]
 
   sources = [
-    "android/app_web_message_port_service.h",
     "android/browser_media_player_manager_register.cc",
     "android/browser_media_player_manager_register.h",
     "android/compositor.h",
@@ -147,7 +146,6 @@
     "memory_coordinator_delegate.h",
     "memory_pressure_controller.cc",
     "memory_pressure_controller.h",
-    "message_port_delegate.h",
     "message_port_provider.h",
     "native_web_keyboard_event.h",
     "navigation_controller.cc",
diff --git a/content/public/browser/android/app_web_message_port_service.h b/content/public/browser/android/app_web_message_port_service.h
deleted file mode 100644
index c1dd515..0000000
--- a/content/public/browser/android/app_web_message_port_service.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_PUBLIC_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_SERVICE_H_
-#define CONTENT_PUBLIC_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_SERVICE_H_
-
-#include <jni.h>
-#include <vector>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/values.h"
-
-namespace content {
-class WebContents;
-
-// The interface for AppWebMessagePortService
-class AppWebMessagePortService {
- public:
-  virtual ~AppWebMessagePortService() {}
-
-  virtual void CreateMessageChannel(
-      JNIEnv* env,
-      const base::android::JavaRef<jobjectArray>& ports,
-      WebContents* web_contents) = 0;
-
-  virtual void CleanupPort(int message_port_id) = 0;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_BROWSER_ANDROID_APP_WEB_MESSAGE_PORT_SERVICE_H_
diff --git a/content/public/browser/message_port_delegate.h b/content/public/browser/message_port_delegate.h
deleted file mode 100644
index 4364ba7..0000000
--- a/content/public/browser/message_port_delegate.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_PUBLIC_BROWSER_MESSAGE_PORT_DELEGATE_H_
-#define CONTENT_PUBLIC_BROWSER_MESSAGE_PORT_DELEGATE_H_
-
-#include <vector>
-
-#include "base/strings/string16.h"
-#include "content/common/content_export.h"
-
-// Windows headers will redefine SendMessage.
-#ifdef SendMessage
-#undef SendMessage
-#endif
-
-namespace content {
-
-// Delegate used by MessagePortService to send messages to message ports to the
-// correct renderer. Delegates are responsible for managing their own lifetime,
-// and should call MessagePortService::OnMessagePortDelegateClosing if they are
-// destroyed while there are still message ports associated with them.
-class CONTENT_EXPORT MessagePortDelegate {
- public:
-  // Sends a message to the given route. Implementations are responsible for
-  // updating MessagePortService with new routes for the sent message ports.
-  virtual void SendMessage(
-      int route_id,
-      const base::string16& message,
-      const std::vector<int>& sent_message_ports) = 0;
-
-  // Requests messages to the given route to be queued.
-  virtual void SendMessagesAreQueued(int route_id) = 0;
-
- protected:
-  virtual ~MessagePortDelegate() {}
-};
-
-}  // namespace content
-
-#endif  // CONTENT_PUBLIC_BROWSER_MESSAGE_PORT_DELEGATE_H_
diff --git a/content/public/browser/message_port_provider.h b/content/public/browser/message_port_provider.h
index 5d99796..4a879e0 100644
--- a/content/public/browser/message_port_provider.h
+++ b/content/public/browser/message_port_provider.h
@@ -12,17 +12,18 @@
 #include "base/strings/string16.h"
 #include "content/common/content_export.h"
 
-namespace content {
+#if defined(OS_ANDROID)
+#include "base/android/scoped_java_ref.h"
+#endif
 
-class AppWebMessagePortService;
+namespace content {
 class WebContents;
 
 // An interface consisting of methods that can be called to use Message ports.
 class CONTENT_EXPORT MessagePortProvider {
  public:
   // Posts a MessageEvent to the main frame using the given source and target
-  // origins and data. The caller may also provide any message port ids as
-  // part of the message.
+  // origins and data.
   // See https://html.spec.whatwg.org/multipage/comms.html#messageevent for
   // further information on message events.
   // Should be called on UI thread.
@@ -30,11 +31,16 @@
       WebContents* web_contents,
       const base::string16& source_origin,
       const base::string16& target_origin,
-      const base::string16& data,
-      const std::vector<int>& ports);
+      const base::string16& data);
 
 #if defined(OS_ANDROID)
-  static content::AppWebMessagePortService* GetAppWebMessagePortService();
+  static void PostMessageToFrame(
+      WebContents* web_contents,
+      JNIEnv* env,
+      const base::android::JavaParamRef<jstring>& source_origin,
+      const base::android::JavaParamRef<jstring>& target_origin,
+      const base::android::JavaParamRef<jstring>& data,
+      const base::android::JavaParamRef<jobjectArray>& ports);
 #endif
 
  private:
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index 32e954e..a562bf0d 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -236,36 +236,36 @@
   aura::test::InitializeAuraEventGeneratorDelegate();
 #endif
 
-  bool use_osmesa = true;
+  bool use_software_gl = true;
 
-  // We usually use OSMesa as this works on all bots. The command line can
-  // override this behaviour to use hardware GL.
+  // We usually use software GL as this works on all bots. The command
+  // line can override this behaviour to use hardware GL.
   if (command_line->HasSwitch(switches::kUseGpuInTests))
-    use_osmesa = false;
+    use_software_gl = false;
 
   // Some bots pass this flag when they want to use hardware GL.
   if (command_line->HasSwitch("enable-gpu"))
-    use_osmesa = false;
+    use_software_gl = false;
 
 #if defined(OS_MACOSX)
   // On Mac we always use hardware GL.
-  use_osmesa = false;
+  use_software_gl = false;
 #endif
 
 #if defined(OS_ANDROID)
   // On Android we always use hardware GL.
-  use_osmesa = false;
+  use_software_gl = false;
 #endif
 
 #if defined(OS_CHROMEOS)
   // If the test is running on the chromeos envrionment (such as
   // device or vm bots), we use hardware GL.
   if (base::SysInfo::IsRunningOnChromeOS())
-    use_osmesa = false;
+    use_software_gl = false;
 #endif
 
-  if (use_osmesa && !use_software_compositing_)
-    command_line->AppendSwitch(switches::kOverrideUseGLWithOSMesaForTests);
+  if (use_software_gl && !use_software_compositing_)
+    command_line->AppendSwitch(switches::kOverrideUseSoftwareGLForTests);
 
   scoped_refptr<net::HostResolverProc> local_resolver =
       new LocalHostResolverProc();
@@ -399,10 +399,10 @@
   use_software_compositing_ = true;
 }
 
-bool BrowserTestBase::UsingOSMesa() const {
+bool BrowserTestBase::UsingSoftwareGL() const {
   base::CommandLine* cmd = base::CommandLine::ForCurrentProcess();
   return cmd->GetSwitchValueASCII(switches::kUseGL) ==
-         gl::kGLImplementationOSMesaName;
+         gl::GetGLImplementationName(gl::GetSoftwareGLImplementation());
 }
 
 }  // namespace content
diff --git a/content/public/test/browser_test_base.h b/content/public/test/browser_test_base.h
index fa14d40..168ba75 100644
--- a/content/public/test/browser_test_base.h
+++ b/content/public/test/browser_test_base.h
@@ -121,8 +121,8 @@
   // instead.
   void UseSoftwareCompositing();
 
-  // Returns true if the test will be using GL acceleration via OSMesa.
-  bool UsingOSMesa() const;
+  // Returns true if the test will be using GL acceleration via a software GL.
+  bool UsingSoftwareGL() const;
 
  private:
   void ProxyRunTestOnMainThreadLoop();
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index 0db1fe1..074717d 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -36,8 +36,6 @@
     "accessibility/render_accessibility_impl.h",
     "android/address_detector.cc",
     "android/address_detector.h",
-    "android/app_web_message_port_client.cc",
-    "android/app_web_message_port_client.h",
     "android/content_detector.cc",
     "android/content_detector.h",
     "android/disambiguation_popup_helper.cc",
diff --git a/content/renderer/android/app_web_message_port_client.cc b/content/renderer/android/app_web_message_port_client.cc
deleted file mode 100644
index d2b7dd67..0000000
--- a/content/renderer/android/app_web_message_port_client.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/renderer/android/app_web_message_port_client.h"
-
-#include <memory>
-#include <utility>
-
-#include "content/common/app_web_message_port_messages.h"
-#include "content/public/child/v8_value_converter.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/public/renderer/render_view.h"
-#include "ipc/ipc_message_macros.h"
-#include "third_party/WebKit/public/platform/WebString.h"
-#include "third_party/WebKit/public/web/WebFrame.h"
-#include "third_party/WebKit/public/web/WebKit.h"
-#include "third_party/WebKit/public/web/WebSerializedScriptValue.h"
-#include "third_party/WebKit/public/web/WebView.h"
-#include "v8/include/v8.h"
-
-using blink::WebSerializedScriptValue;
-using content::V8ValueConverter;
-using std::vector;
-
-namespace content {
-
-AppWebMessagePortClient::AppWebMessagePortClient(
-    content::RenderFrame* render_frame)
-    : content::RenderFrameObserver(render_frame) {}
-
-AppWebMessagePortClient::~AppWebMessagePortClient() {}
-
-bool AppWebMessagePortClient::OnMessageReceived(const IPC::Message& message) {
-  bool handled = true;
-  IPC_BEGIN_MESSAGE_MAP(AppWebMessagePortClient, message)
-    IPC_MESSAGE_HANDLER(AppWebMessagePortMsg_WebToAppMessage, OnWebToAppMessage)
-    IPC_MESSAGE_HANDLER(AppWebMessagePortMsg_AppToWebMessage, OnAppToWebMessage)
-    IPC_MESSAGE_HANDLER(AppWebMessagePortMsg_ClosePort, OnClosePort)
-    IPC_MESSAGE_UNHANDLED(handled = false)
-  IPC_END_MESSAGE_MAP()
-
-  return handled;
-}
-
-void AppWebMessagePortClient::OnDestruct() {
-  delete this;
-}
-
-void AppWebMessagePortClient::OnWebToAppMessage(
-    int message_port_id,
-    const base::string16& message,
-    const vector<int>& sent_message_port_ids) {
-  v8::HandleScope handle_scope(blink::mainThreadIsolate());
-  blink::WebFrame* main_frame =
-      render_frame()->GetRenderView()->GetWebView()->mainFrame();
-  if (main_frame == nullptr) {
-    return;
-  }
-  v8::Local<v8::Context> context = main_frame->mainWorldScriptContext();
-  v8::Context::Scope context_scope(context);
-  DCHECK(!context.IsEmpty());
-  WebSerializedScriptValue v = WebSerializedScriptValue::fromString(
-      blink::WebString::fromUTF16(message));
-  v8::Local<v8::Value> v8value = v.deserialize();
-
-  std::unique_ptr<V8ValueConverter> converter;
-  converter.reset(V8ValueConverter::create());
-  converter->SetDateAllowed(true);
-  converter->SetRegExpAllowed(true);
-  base::ListValue result;
-  std::unique_ptr<base::Value> value = converter->FromV8Value(v8value, context);
-  if (value) {
-    result.Append(std::move(value));
-  }
-
-  Send(new AppWebMessagePortHostMsg_ConvertedWebToAppMessage(
-      render_frame()->GetRoutingID(), message_port_id, result,
-      sent_message_port_ids));
-}
-
-void AppWebMessagePortClient::OnAppToWebMessage(
-    int message_port_id,
-    const base::string16& message,
-    const vector<int>& sent_message_port_ids) {
-  v8::HandleScope handle_scope(blink::mainThreadIsolate());
-  blink::WebFrame* main_frame =
-      render_frame()->GetRenderView()->GetWebView()->mainFrame();
-  if (main_frame == nullptr) {
-    return;
-  }
-  v8::Local<v8::Context> context = main_frame->mainWorldScriptContext();
-  v8::Context::Scope context_scope(context);
-  DCHECK(!context.IsEmpty());
-  std::unique_ptr<V8ValueConverter> converter;
-  converter.reset(V8ValueConverter::create());
-  converter->SetDateAllowed(true);
-  converter->SetRegExpAllowed(true);
-  std::unique_ptr<base::Value> value(new base::StringValue(message));
-  v8::Local<v8::Value> result_value =
-      converter->ToV8Value(value.get(), context);
-  WebSerializedScriptValue serialized_script_value =
-      WebSerializedScriptValue::serialize(result_value);
-  base::string16 result = serialized_script_value.toString().utf16();
-  Send(new AppWebMessagePortHostMsg_ConvertedAppToWebMessage(
-      render_frame()->GetRoutingID(), message_port_id, result,
-      sent_message_port_ids));
-}
-
-void AppWebMessagePortClient::OnClosePort(int message_port_id) {
-  Send(new AppWebMessagePortHostMsg_ClosePortAck(render_frame()->GetRoutingID(),
-                                                 message_port_id));
-}
-}
diff --git a/content/renderer/android/app_web_message_port_client.h b/content/renderer/android/app_web_message_port_client.h
deleted file mode 100644
index e2c3f8d..0000000
--- a/content/renderer/android/app_web_message_port_client.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_RENDERER_ANDROID_APP_WEB_MESSAGE_PORT_CLIENT_H_
-#define CONTENT_RENDERER_ANDROID_APP_WEB_MESSAGE_PORT_CLIENT_H_
-
-#include <vector>
-
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "content/public/renderer/render_frame_observer.h"
-
-namespace content {
-
-// Renderer side of Android webview specific message port service. This service
-// is used to convert messages from WebSerializedScriptValue to a base value.
-class AppWebMessagePortClient : public content::RenderFrameObserver {
- public:
-  explicit AppWebMessagePortClient(content::RenderFrame* render_frame);
-
- private:
-  ~AppWebMessagePortClient() override;
-
-  // RenderFrameObserver
-  bool OnMessageReceived(const IPC::Message& message) override;
-  void OnDestruct() override;
-
-  void OnWebToAppMessage(int message_port_id,
-                         const base::string16& message,
-                         const std::vector<int>& sent_message_port_ids);
-  void OnAppToWebMessage(int message_port_id,
-                         const base::string16& message,
-                         const std::vector<int>& sent_message_port_ids);
-  void OnClosePort(int message_port_id);
-
-  DISALLOW_COPY_AND_ASSIGN(AppWebMessagePortClient);
-};
-}
-
-#endif  // CONTENT_RENDERER_ANDROID_APP_WEB_MESSAGE_PORT_CLIENT_H_
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index ed1189ed..2e9c7d13 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -235,7 +235,6 @@
 #if defined(OS_ANDROID)
 #include <cpu-features.h>
 
-#include "content/renderer/android/app_web_message_port_client.h"
 #include "content/renderer/java/gin_java_bridge_dispatcher.h"
 #include "content/renderer/media/android/media_player_renderer_client_factory.h"
 #include "content/renderer/media/android/renderer_media_player_manager.h"
@@ -1239,10 +1238,6 @@
   // embedder can call GetWebFrame on any RenderFrame.
   GetContentClient()->renderer()->RenderFrameCreated(this);
 
-#if defined(OS_ANDROID)
-  new AppWebMessagePortClient(this);
-#endif
-
   RenderThreadImpl* render_thread = RenderThreadImpl::current();
   // render_thread may be NULL in tests.
   InputHandlerManager* input_handler_manager =
@@ -2210,9 +2205,7 @@
 
   // If the message contained MessagePorts, create the corresponding endpoints.
   blink::WebMessagePortChannelArray channels =
-      WebMessagePortChannelImpl::CreatePorts(
-          params.message_ports, params.new_routing_ids,
-          base::ThreadTaskRunnerHandle::Get().get());
+      WebMessagePortChannelImpl::CreateFromMessagePorts(params.message_ports);
 
   WebSerializedScriptValue serialized_script_value;
   if (params.is_data_raw_string) {
@@ -2241,7 +2234,9 @@
 
   WebDOMMessageEvent msg_event(serialized_script_value,
                                WebString::fromUTF16(params.source_origin),
-                               source_frame, frame_->document(), channels);
+                               source_frame,
+                               frame_->document(),
+                               std::move(channels));
   frame_->dispatchMessageEventWithOriginCheck(target_origin, msg_event);
 }
 
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 15d61ea9..76f4862 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -451,7 +451,7 @@
     params.target_origin = target_origin.toString().utf16();
 
   params.message_ports =
-      WebMessagePortChannelImpl::ExtractMessagePortIDs(event.releaseChannels());
+      WebMessagePortChannelImpl::ExtractMessagePorts(event.releaseChannels());
 
   // Include the routing ID for the source frame (if one exists), which the
   // browser process will translate into the routing ID for the equivalent
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index 082ee02ef..9b33811 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -383,8 +383,7 @@
 void RendererBlinkPlatformImpl::createMessageChannel(
     blink::WebMessagePortChannel** channel1,
     blink::WebMessagePortChannel** channel2) {
-  WebMessagePortChannelImpl::CreatePair(
-      default_task_runner_, channel1, channel2);
+  WebMessagePortChannelImpl::CreatePair(channel1, channel2);
 }
 
 blink::WebPrescientNetworking*
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index b05b622..60f3f77 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -33,7 +33,6 @@
 #include "content/child/web_url_loader_impl.h"
 #include "content/child/webmessageportchannel_impl.h"
 #include "content/common/devtools_messages.h"
-#include "content/common/message_port_messages.h"
 #include "content/common/service_worker/embedded_worker_messages.h"
 #include "content/common/service_worker/service_worker_event_dispatcher.mojom.h"
 #include "content/common/service_worker/service_worker_messages.h"
@@ -129,17 +128,6 @@
   return SERVICE_WORKER_ERROR_FAILED;
 }
 
-void SendPostMessageToClientOnMainThread(
-    ThreadSafeSender* sender,
-    int routing_id,
-    const std::string& uuid,
-    const base::string16& message,
-    std::unique_ptr<blink::WebMessagePortChannelArray> channels) {
-  sender->Send(new ServiceWorkerHostMsg_PostMessageToClient(
-      routing_id, uuid, message,
-      WebMessagePortChannelImpl::ExtractMessagePortIDs(std::move(channels))));
-}
-
 blink::WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode(
     FetchRequestMode mode) {
   return static_cast<blink::WebURLRequest::FetchRequestMode>(mode);
@@ -839,17 +827,10 @@
 void ServiceWorkerContextClient::postMessageToClient(
     const blink::WebString& uuid,
     const blink::WebString& message,
-    blink::WebMessagePortChannelArray* channels) {
-  // This may send channels for MessagePorts, and all internal book-keeping
-  // messages for MessagePort (e.g. QueueMessages) are sent from main thread
-  // (with thread hopping), so we need to do the same thread hopping here not
-  // to overtake those messages.
-  std::unique_ptr<blink::WebMessagePortChannelArray> channel_array(channels);
-  main_thread_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&SendPostMessageToClientOnMainThread,
-                 base::RetainedRef(sender_), GetRoutingID(), uuid.utf8(),
-                 message.utf16(), base::Passed(&channel_array)));
+    blink::WebMessagePortChannelArray channels) {
+  Send(new ServiceWorkerHostMsg_PostMessageToClient(
+      GetRoutingID(), uuid.utf8(), message.utf16(),
+      WebMessagePortChannelImpl::ExtractMessagePorts(std::move(channels))));
 }
 
 void ServiceWorkerContextClient::focus(
@@ -967,15 +948,14 @@
       base::MakeUnique<DispatchExtendableMessageEventCallback>(callback));
 
   blink::WebMessagePortChannelArray ports =
-      WebMessagePortChannelImpl::CreatePorts(event->message_ports,
-                                             event->new_routing_ids,
-                                             main_thread_task_runner_);
+      WebMessagePortChannelImpl::CreateFromMessagePipeHandles(
+          std::move(event->message_ports));
   if (event->source.client_info.IsValid()) {
     blink::WebServiceWorkerClientInfo web_client =
         ToWebServiceWorkerClientInfo(event->source.client_info);
     proxy_->dispatchExtendableMessageEvent(
         request_id, blink::WebString::fromUTF16(event->message),
-        event->source_origin, ports, web_client);
+        event->source_origin, std::move(ports), web_client);
     return;
   }
 
@@ -990,7 +970,8 @@
       dispatcher->GetOrCreateServiceWorker(std::move(handle));
   proxy_->dispatchExtendableMessageEvent(
       request_id, blink::WebString::fromUTF16(event->message),
-      event->source_origin, ports, WebServiceWorkerImpl::CreateHandle(worker));
+      event->source_origin, std::move(ports),
+      WebServiceWorkerImpl::CreateHandle(worker));
 }
 
 void ServiceWorkerContextClient::OnInstallEvent(int request_id) {
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 22640bba..3b1868e 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -180,10 +180,9 @@
       blink::WebDataSource* data_source) override;
   blink::WebServiceWorkerProvider* createServiceWorkerProvider() override;
 
-  void postMessageToClient(
-      const blink::WebString& uuid,
-      const blink::WebString& message,
-      blink::WebMessagePortChannelArray* channels) override;
+  void postMessageToClient(const blink::WebString& uuid,
+                           const blink::WebString& message,
+                           blink::WebMessagePortChannelArray channels) override;
   void focus(const blink::WebString& uuid,
              std::unique_ptr<blink::WebServiceWorkerClientCallbacks>) override;
   void navigate(
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.cc b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
index 60a035f..b0ac6424 100644
--- a/content/renderer/shared_worker/embedded_shared_worker_stub.cc
+++ b/content/renderer/shared_worker/embedded_shared_worker_stub.cc
@@ -189,22 +189,13 @@
   Send(new WorkerHostMsg_WorkerScriptLoaded(route_id_));
   running_ = true;
   // Process any pending connections.
-  for (PendingChannelList::const_iterator iter = pending_channels_.begin();
-       iter != pending_channels_.end();
-       ++iter) {
-    ConnectToChannel(*iter);
-  }
+  for (auto& item : pending_channels_)
+    ConnectToChannel(item.first, std::move(item.second));
   pending_channels_.clear();
 }
 
 void EmbeddedSharedWorkerStub::workerScriptLoadFailed() {
   Send(new WorkerHostMsg_WorkerScriptLoadFailed(route_id_));
-  for (PendingChannelList::const_iterator iter = pending_channels_.begin();
-       iter != pending_channels_.end();
-       ++iter) {
-    blink::WebMessagePortChannel* channel = *iter;
-    channel->destroy();
-  }
   pending_channels_.clear();
   Shutdown();
 }
@@ -301,24 +292,24 @@
 }
 
 void EmbeddedSharedWorkerStub::ConnectToChannel(
-    WebMessagePortChannelImpl* channel) {
-  impl_->connect(channel);
-  Send(
-      new WorkerHostMsg_WorkerConnected(channel->message_port_id(), route_id_));
+    int connection_request_id,
+    std::unique_ptr<WebMessagePortChannelImpl> channel) {
+  impl_->connect(channel.release());
+  Send(new WorkerHostMsg_WorkerConnected(connection_request_id, route_id_));
 }
 
-void EmbeddedSharedWorkerStub::OnConnect(int port,
-                                         int routing_id) {
-  WebMessagePortChannelImpl* channel = new WebMessagePortChannelImpl(
-      routing_id, port, base::ThreadTaskRunnerHandle::Get().get());
+void EmbeddedSharedWorkerStub::OnConnect(int connection_request_id,
+                                         const MessagePort& port) {
+  auto channel = base::MakeUnique<WebMessagePortChannelImpl>(port);
   if (running_) {
-    ConnectToChannel(channel);
+    ConnectToChannel(connection_request_id, std::move(channel));
   } else {
     // If two documents try to load a SharedWorker at the same time, the
     // WorkerMsg_Connect for one of the documents can come in before the
     // worker is started. Just queue up the connect and deliver it once the
     // worker starts.
-    pending_channels_.push_back(channel);
+    pending_channels_.emplace_back(
+        std::make_pair(connection_request_id, std::move(channel)));
   }
 }
 
diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.h b/content/renderer/shared_worker/embedded_shared_worker_stub.h
index 9ad827e..e95ba98 100644
--- a/content/renderer/shared_worker/embedded_shared_worker_stub.h
+++ b/content/renderer/shared_worker/embedded_shared_worker_stub.h
@@ -28,6 +28,7 @@
 }
 
 namespace content {
+class MessagePort;
 class SharedWorkerDevToolsAgent;
 class WebApplicationCacheHostImpl;
 class WebMessagePortChannelImpl;
@@ -88,9 +89,11 @@
   bool Send(IPC::Message* message);
 
   // WebSharedWorker will own |channel|.
-  void ConnectToChannel(WebMessagePortChannelImpl* channel);
+  void ConnectToChannel(int connection_request_id,
+                        std::unique_ptr<WebMessagePortChannelImpl> channel);
 
-  void OnConnect(int sent_message_port_id, int routing_id);
+  void OnConnect(int connection_request_id,
+                 const MessagePort& sent_message_port);
   void OnTerminateWorkerContext();
 
   int route_id_;
@@ -100,8 +103,9 @@
   blink::WebSharedWorker* impl_ = nullptr;
   std::unique_ptr<SharedWorkerDevToolsAgent> worker_devtools_agent_;
 
-  typedef std::vector<WebMessagePortChannelImpl*> PendingChannelList;
-  PendingChannelList pending_channels_;
+  using PendingChannel = std::pair<int /* connection_request_id */,
+                                   std::unique_ptr<WebMessagePortChannelImpl>>;
+  std::vector<PendingChannel> pending_channels_;
 
   ScopedChildProcessReference process_ref_;
   WebApplicationCacheHostImpl* app_cache_host_ = nullptr;
diff --git a/content/renderer/shared_worker/websharedworker_proxy.cc b/content/renderer/shared_worker/websharedworker_proxy.cc
index e29fa0b2..c0c412f 100644
--- a/content/renderer/shared_worker/websharedworker_proxy.cc
+++ b/content/renderer/shared_worker/websharedworker_proxy.cc
@@ -9,7 +9,6 @@
 #include "content/child/child_thread_impl.h"
 #include "content/child/webmessageportchannel_impl.h"
 #include "content/common/view_messages.h"
-#include "content/common/worker_messages.h"
 #include "ipc/message_router.h"
 
 namespace content {
@@ -20,7 +19,6 @@
     blink::WebMessagePortChannel* channel)
     : route_id_(MSG_ROUTING_NONE),
       router_(ChildThreadImpl::current()->GetRouter()),
-      message_port_id_(MSG_ROUTING_NONE),
       listener_(std::move(listener)) {
   connect(params, channel);
 }
@@ -40,14 +38,11 @@
   router_->AddRoute(route_id_, this);
   listener_->workerCreated(reply.error);
 
-  DCHECK_EQ(MSG_ROUTING_NONE, message_port_id_);
-  WebMessagePortChannelImpl* webchannel =
-        static_cast<WebMessagePortChannelImpl*>(channel);
-  message_port_id_ = webchannel->message_port_id();
-  DCHECK_NE(MSG_ROUTING_NONE, message_port_id_);
-  webchannel->QueueMessages();
-  // |webchannel| is intentionally leaked here: it'll be removed at
-  // WebMessagePortChannelImpl::OnMessagesQueued().
+  // Accept ownership of the channel.
+  std::unique_ptr<WebMessagePortChannelImpl> channel_impl(
+      static_cast<WebMessagePortChannelImpl*>(channel));
+
+  message_port_ = channel_impl->ReleaseMessagePort();
 
   // An actual connection request will be issued on OnWorkerCreated().
 }
@@ -68,9 +63,10 @@
 }
 
 void WebSharedWorkerProxy::OnWorkerCreated() {
-  // The worker is created - now send off the connection request.
-  router_->Send(
-      new ViewHostMsg_ConnectToWorker(route_id_, message_port_id_));
+  DCHECK(message_port_.GetHandle().is_valid());
+
+  // The worker is created - now send off the connect message.
+  router_->Send(new ViewHostMsg_ConnectToWorker(route_id_, message_port_));
 }
 
 void WebSharedWorkerProxy::OnWorkerScriptLoadFailed() {
diff --git a/content/renderer/shared_worker/websharedworker_proxy.h b/content/renderer/shared_worker/websharedworker_proxy.h
index 1e561fd1..3a59a400 100644
--- a/content/renderer/shared_worker/websharedworker_proxy.h
+++ b/content/renderer/shared_worker/websharedworker_proxy.h
@@ -8,6 +8,7 @@
 #include <set>
 
 #include "base/macros.h"
+#include "content/common/message_port.h"
 #include "ipc/ipc_listener.h"
 #include "third_party/WebKit/public/web/WebSharedWorkerConnectListener.h"
 #include "third_party/WebKit/public/web/WebSharedWorkerCreationErrors.h"
@@ -57,7 +58,7 @@
 
   IPC::MessageRouter* const router_;
 
-  int message_port_id_;
+  MessagePort message_port_;
   std::unique_ptr<blink::WebSharedWorkerConnectListener> listener_;
 
   DISALLOW_COPY_AND_ASSIGN(WebSharedWorkerProxy);
diff --git a/content/shell/app/shell_main_delegate.cc b/content/shell/app/shell_main_delegate.cc
index 28ce63b..b3efdc1 100644
--- a/content/shell/app/shell_main_delegate.cc
+++ b/content/shell/app/shell_main_delegate.cc
@@ -42,6 +42,7 @@
 #include "ui/base/ui_base_paths.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/display/display_switches.h"
+#include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_switches.h"
 
 #include "ipc/ipc_message.h"  // For IPC_MESSAGE_LOG_ENABLED.
@@ -167,11 +168,12 @@
     command_line.AppendSwitch(switches::kProcessPerTab);
     command_line.AppendSwitch(switches::kEnableLogging);
     command_line.AppendSwitch(switches::kAllowFileAccessFromFiles);
-    // only default to osmesa if the flag isn't already specified.
+    // only default to a software GL if the flag isn't already specified.
     if (!command_line.HasSwitch(switches::kUseGpuInTests) &&
         !command_line.HasSwitch(switches::kUseGL)) {
-      command_line.AppendSwitchASCII(switches::kUseGL,
-                                     gl::kGLImplementationOSMesaName);
+      command_line.AppendSwitchASCII(
+          switches::kUseGL,
+          gl::GetGLImplementationName(gl::GetSoftwareGLImplementation()));
     }
     command_line.AppendSwitch(switches::kSkipGpuDataLoading);
     command_line.AppendSwitchASCII(
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index addf59f..a2e79bb9 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1681,6 +1681,7 @@
       "../browser/android/java/java_type_unittest.cc",
       "../browser/android/java/jni_helper_unittest.cc",
       "../browser/android/scoped_surface_request_manager_unittest.cc",
+      "../browser/android/string_message_codec_unittest.cc",
       "../browser/android/url_request_content_job_unittest.cc",
       "../browser/media/capture/screen_capture_device_android_unittest.cc",
       "../renderer/java/gin_java_bridge_value_converter_unittest.cc",
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py
index 9874072..9051f2003 100755
--- a/content/test/gpu/generate_buildbot_json.py
+++ b/content/test/gpu/generate_buildbot_json.py
@@ -1162,6 +1162,22 @@
       '--test-launcher-retry-limit=0'
     ]
   },
+  # white_box tests should run where end2end tests run
+  'angle_white_box_tests': {
+    'tester_configs': [
+      {
+        'predicate': Predicates.FYI_AND_OPTIONAL,
+        # There are only Windows white box tests for now.
+        # Enable on more configs when there will be relevant tests.
+        'os_types': ['win'],
+      },
+    ],
+    'desktop_args': [
+      # ANGLE test retries deliberately disabled to prevent flakiness.
+      # http://crbug.com/669196
+      '--test-launcher-retry-limit=0'
+    ]
+  },
   'angle_unittests': {
     'desktop_args': [
       '--use-gpu-in-tests',
diff --git a/gpu/ipc/host/gpu_memory_buffer_support.cc b/gpu/ipc/host/gpu_memory_buffer_support.cc
index cbd3655..860257c 100644
--- a/gpu/ipc/host/gpu_memory_buffer_support.cc
+++ b/gpu/ipc/host/gpu_memory_buffer_support.cc
@@ -10,14 +10,16 @@
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
 #include "gpu/ipc/host/gpu_switches.h"
 #include "ui/gl/gl_bindings.h"
+#include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_switches.h"
 
 namespace gpu {
 
 bool AreNativeGpuMemoryBuffersEnabled() {
-  // Disable native buffers when using Mesa.
+  // Disable native buffers when using software GL.
   if (base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          switches::kUseGL) == gl::kGLImplementationOSMesaName) {
+          switches::kUseGL) ==
+      gl::GetGLImplementationName(gl::GetSoftwareGLImplementation())) {
     return false;
   }
 
@@ -57,10 +59,11 @@
     }
   }
 
-  // Disable native buffers only when using Mesa.
+  // Disable native buffers only when using software GL.
   bool force_native_gpu_read_write_formats =
       base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          switches::kUseGL) != gl::kGLImplementationOSMesaName;
+          switches::kUseGL) !=
+      gl::GetGLImplementationName(gl::GetSoftwareGLImplementation());
   if (force_native_gpu_read_write_formats) {
     const gfx::BufferFormat kGPUReadWriteFormats[] = {
         gfx::BufferFormat::BGR_565,   gfx::BufferFormat::RGBA_8888,
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc
index facd39f..8ed8042 100644
--- a/gpu/ipc/service/gpu_init.cc
+++ b/gpu/ipc/service/gpu_init.cc
@@ -224,9 +224,9 @@
   UMA_HISTOGRAM_MEDIUM_TIMES("GPU.InitializeOneOffMediumTime",
                              initialize_one_off_time);
 
-  // OSMesa is expected to run very slowly, so disable the watchdog in that
-  // case.
-  if (gl::GetGLImplementation() == gl::kGLImplementationOSMesaGL) {
+  // Software GL is expected to run slowly, so disable the watchdog
+  // in that case.
+  if (gl::GetGLImplementation() == gl::GetSoftwareGLImplementation()) {
     if (watchdog_thread_)
       watchdog_thread_->Stop();
     watchdog_thread_ = nullptr;
diff --git a/gpu/skia_bindings/grcontext_for_gles2_interface.cc b/gpu/skia_bindings/grcontext_for_gles2_interface.cc
index a471871..1f16141 100644
--- a/gpu/skia_bindings/grcontext_for_gles2_interface.cc
+++ b/gpu/skia_bindings/grcontext_for_gles2_interface.cc
@@ -29,7 +29,7 @@
   if (gr_context_) {
     // The limit of the number of GPU resources we hold in the GrContext's
     // GPU cache.
-    static const int kMaxGaneshResourceCacheCount = 8196;
+    static const int kMaxGaneshResourceCacheCount = 16384;
     // The limit of the bytes allocated toward GPU resources in the GrContext's
     // GPU cache.
     static const size_t kMaxGaneshResourceCacheBytes = 96 * 1024 * 1024;
diff --git a/ios/chrome/browser/payments/BUILD.gn b/ios/chrome/browser/payments/BUILD.gn
index f39a91ef..9109cc2 100644
--- a/ios/chrome/browser/payments/BUILD.gn
+++ b/ios/chrome/browser/payments/BUILD.gn
@@ -45,6 +45,7 @@
     ":injected_js",
     "//base",
     "//components/autofill/core/browser",
+    "//components/autofill/ios/browser",
     "//components/payments:payment_validation",
     "//components/strings",
     "//ios/chrome/app/strings",
@@ -54,6 +55,7 @@
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/payments/cells",
     "//ios/chrome/browser/ui",
+    "//ios/chrome/browser/ui/autofill",
     "//ios/chrome/browser/ui/autofill/cells",
     "//ios/chrome/browser/ui/collection_view",
     "//ios/chrome/browser/ui/collection_view/cells",
diff --git a/ios/chrome/browser/payments/payment_request_coordinator.h b/ios/chrome/browser/payments/payment_request_coordinator.h
index 10d11e29..b2e1d9a0 100644
--- a/ios/chrome/browser/payments/payment_request_coordinator.h
+++ b/ios/chrome/browser/payments/payment_request_coordinator.h
@@ -7,6 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
+#include "components/autofill/core/browser/autofill_manager.h"
 #import "ios/chrome/browser/chrome_coordinator.h"
 #import "ios/chrome/browser/payments/payment_items_display_coordinator.h"
 #import "ios/chrome/browser/payments/payment_method_selection_coordinator.h"
@@ -15,6 +16,10 @@
 #import "ios/chrome/browser/payments/shipping_address_selection_coordinator.h"
 #import "ios/chrome/browser/payments/shipping_option_selection_coordinator.h"
 
+namespace ios {
+class ChromeBrowserState;
+}
+
 @class PaymentRequestCoordinator;
 
 // Delegate protocol for PaymentRequestCoordinator.
@@ -58,6 +63,14 @@
 // owned by this class and should outlive it.
 @property(nonatomic, assign) PaymentRequest* paymentRequest;
 
+// An instance of autofill::AutofillManager used for credit card unmasking. This
+// reference is not owned by this class.
+@property(nonatomic, assign) autofill::AutofillManager* autofillManager;
+
+// An ios::ChromeBrowserState instance. This reference is not owned by this
+// class.
+@property(nonatomic, assign) ios::ChromeBrowserState* browserState;
+
 // The favicon of the page invoking the PaymentRequest API. Should be set before
 // calling |start|.
 @property(nonatomic, retain) UIImage* pageFavicon;
@@ -76,6 +89,10 @@
 // Updates the payment details of the PaymentRequest and updates the UI.
 - (void)updatePaymentDetails:(web::PaymentDetails)paymentDetails;
 
+// Called when a credit card has been successfully unmasked.
+- (void)fullCardRequestDidSucceedWithCard:(const autofill::CreditCard&)card
+                                      CVC:(const base::string16&)cvc;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_PAYMENTS_PAYMENT_REQUEST_COORDINATOR_H_
diff --git a/ios/chrome/browser/payments/payment_request_coordinator.mm b/ios/chrome/browser/payments/payment_request_coordinator.mm
index fd0d71d..29e293a 100644
--- a/ios/chrome/browser/payments/payment_request_coordinator.mm
+++ b/ios/chrome/browser/payments/payment_request_coordinator.mm
@@ -10,16 +10,110 @@
 #import "base/ios/weak_nsobject.h"
 #include "base/mac/objc_property_releaser.h"
 #include "base/mac/scoped_nsobject.h"
+#include "base/memory/ptr_util.h"
+#include "base/memory/weak_ptr.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/autofill_client.h"
 #include "components/autofill/core/browser/autofill_data_util.h"
 #include "components/autofill/core/browser/autofill_profile.h"
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/field_types.h"
+#include "components/autofill/core/browser/payments/full_card_request.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
+#include "components/autofill/core/browser/ui/card_unmask_prompt_controller_impl.h"
 #include "ios/chrome/browser/application_context.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/payments/payment_request.h"
 #include "ios/chrome/browser/payments/payment_request_util.h"
+#include "ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.h"
+
+// The unmask prompt UI for Payment Request.
+class PRCardUnmaskPromptViewBridge
+    : public autofill::CardUnmaskPromptViewBridge {
+ public:
+  explicit PRCardUnmaskPromptViewBridge(
+      autofill::CardUnmaskPromptController* controller,
+      UIViewController* base_view_controller)
+      : autofill::CardUnmaskPromptViewBridge(controller),
+        base_view_controller_(base_view_controller){};
+
+  // autofill::CardUnmaskPromptView:
+  void Show() override {
+    view_controller_.reset(
+        [[CardUnmaskPromptViewController alloc] initWithBridge:this]);
+    [base_view_controller_ presentViewController:view_controller_
+                                        animated:YES
+                                      completion:nil];
+  };
+
+ private:
+  UIViewController* base_view_controller_;  // Weak.
+  DISALLOW_COPY_AND_ASSIGN(PRCardUnmaskPromptViewBridge);
+};
+
+// Receives the full credit card details. Also displays the unmask prompt UI.
+class FullCardRequester
+    : public autofill::payments::FullCardRequest::ResultDelegate,
+      public autofill::payments::FullCardRequest::UIDelegate,
+      public base::SupportsWeakPtr<FullCardRequester> {
+ public:
+  explicit FullCardRequester(PaymentRequestCoordinator* owner,
+                             UIViewController* base_view_controller,
+                             ios::ChromeBrowserState* browser_state)
+      : owner_(owner),
+        base_view_controller_(base_view_controller),
+        unmask_controller_(browser_state->GetPrefs(),
+                           browser_state->IsOffTheRecord()) {}
+
+  void GetFullCard(autofill::CreditCard* card,
+                   autofill::AutofillManager* autofill_manager) {
+    DCHECK(card);
+    DCHECK(autofill_manager);
+    autofill_manager->GetOrCreateFullCardRequest()->GetFullCard(
+        *card, autofill::AutofillClient::UNMASK_FOR_PAYMENT_REQUEST,
+        AsWeakPtr(), AsWeakPtr());
+  }
+
+  // payments::FullCardRequest::ResultDelegate:
+  void OnFullCardRequestSucceeded(const autofill::CreditCard& card,
+                                  const base::string16& cvc) override {
+    [owner_ fullCardRequestDidSucceedWithCard:card CVC:cvc];
+  }
+
+  // payments::FullCardRequest::ResultDelegate:
+  void OnFullCardRequestFailed() override {
+    // No action is required here. PRCardUnmaskPromptViewBridge manages its own
+    // life cycle. When the prompt is explicitly dismissed via tapping the close
+    // button (either in presence or absence of an error), the unmask prompt
+    // dialog pops itself and the user is back to the Payment Request UI.
+  }
+
+  // payments::FullCardRequest::UIDelegate:
+  void ShowUnmaskPrompt(
+      const autofill::CreditCard& card,
+      autofill::AutofillClient::UnmaskCardReason reason,
+      base::WeakPtr<autofill::CardUnmaskDelegate> delegate) override {
+    unmask_controller_.ShowPrompt(
+        // PRCardUnmaskPromptViewBridge manages its own lifetime.
+        new PRCardUnmaskPromptViewBridge(&unmask_controller_,
+                                         base_view_controller_),
+        card, reason, delegate);
+  }
+
+  // payments::FullCardRequest::UIDelegate:
+  void OnUnmaskVerificationResult(
+      autofill::AutofillClient::PaymentsRpcResult result) override {
+    unmask_controller_.OnVerificationResult(result);
+  }
+
+ private:
+  PaymentRequestCoordinator* owner_;        // Weak. Owns this instance.
+  UIViewController* base_view_controller_;  // Weak.
+  autofill::CardUnmaskPromptControllerImpl unmask_controller_;
+
+  DISALLOW_COPY_AND_ASSIGN(FullCardRequester);
+};
 
 @interface PaymentRequestCoordinator () {
   base::WeakNSProtocol<id<PaymentRequestCoordinatorDelegate>> _delegate;
@@ -34,6 +128,10 @@
   base::scoped_nsobject<PaymentMethodSelectionCoordinator>
       _methodSelectionCoordinator;
 
+  // Receiver of the full credit card details. Also displays the unmask prompt
+  // UI.
+  std::unique_ptr<FullCardRequester> _fullCardRequester;
+
   base::mac::ObjCPropertyReleaser _propertyReleaser_PaymentRequestCoordinator;
 }
 
@@ -45,6 +143,8 @@
 }
 
 @synthesize paymentRequest = _paymentRequest;
+@synthesize autofillManager = _autofillManager;
+@synthesize browserState = _browserState;
 @synthesize pageFavicon = _pageFavicon;
 @synthesize pageTitle = _pageTitle;
 @synthesize pageHost = _pageHost;
@@ -98,29 +198,28 @@
 
 - (void)sendPaymentResponse {
   DCHECK(_paymentRequest->selected_credit_card());
-  autofill::CreditCard* selectedCreditCard =
-      _paymentRequest->selected_credit_card();
+  autofill::CreditCard* card = _paymentRequest->selected_credit_card();
+  _fullCardRequester = base::MakeUnique<FullCardRequester>(
+      self, _navigationController, _browserState);
+  _fullCardRequester->GetFullCard(card, _autofillManager);
+}
 
-  // TODO(crbug.com/602666): Unmask if this is a server card and/or ask the user
-  //   for CVC here.
-  // TODO(crbug.com/602666): Record the use of this card with the
-  //   PersonalDataManager.
+- (void)fullCardRequestDidSucceedWithCard:(const autofill::CreditCard&)card
+                                      CVC:(const base::string16&)cvc {
   web::PaymentResponse paymentResponse;
   paymentResponse.details.cardholder_name =
-      selectedCreditCard->GetRawInfo(autofill::CREDIT_CARD_NAME_FULL);
+      card.GetRawInfo(autofill::CREDIT_CARD_NAME_FULL);
   paymentResponse.details.card_number =
-      selectedCreditCard->GetRawInfo(autofill::CREDIT_CARD_NUMBER);
+      card.GetRawInfo(autofill::CREDIT_CARD_NUMBER);
   paymentResponse.details.expiry_month =
-      selectedCreditCard->GetRawInfo(autofill::CREDIT_CARD_EXP_MONTH);
+      card.GetRawInfo(autofill::CREDIT_CARD_EXP_MONTH);
   paymentResponse.details.expiry_year =
-      selectedCreditCard->GetRawInfo(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR);
-  paymentResponse.details.card_security_code =
-      selectedCreditCard->GetRawInfo(autofill::CREDIT_CARD_VERIFICATION_CODE);
-  if (!selectedCreditCard->billing_address_id().empty()) {
+      card.GetRawInfo(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR);
+  paymentResponse.details.card_security_code = cvc;
+  if (!card.billing_address_id().empty()) {
     autofill::AutofillProfile* address =
         autofill::PersonalDataManager::GetProfileFromProfilesByGUID(
-            selectedCreditCard->billing_address_id(),
-            _paymentRequest->billing_profiles());
+            card.billing_address_id(), _paymentRequest->billing_profiles());
     if (address) {
       paymentResponse.details.billing_address =
           payment_request_util::PaymentAddressFromAutofillProfile(address);
diff --git a/ios/chrome/browser/payments/payment_request_coordinator_unittest.mm b/ios/chrome/browser/payments/payment_request_coordinator_unittest.mm
index 44c93b1..efe14122 100644
--- a/ios/chrome/browser/payments/payment_request_coordinator_unittest.mm
+++ b/ios/chrome/browser/payments/payment_request_coordinator_unittest.mm
@@ -103,10 +103,10 @@
   EXPECT_EQ(nil, [coordinator baseViewController].presentedViewController);
 }
 
-// Tests that calling the view controller delegate method which notifies the
-// coordinator about confirmation of the PaymentRequest invokes the
-// corresponding coordinator delegate method with the expected information.
-TEST(PaymentRequestCoordinatorTest, DidConfirm) {
+// Tests that calling the card unmasking delegate method which notifies the
+// coordinator about successful unmasking of a credit card invokes the
+// appropriate coordinator delegate method with the expected information.
+TEST(PaymentRequestCoordinatorTest, FullCardRequestDidSucceed) {
   std::unique_ptr<PaymentRequest> payment_request =
       payment_request_test_util::CreateTestPaymentRequest();
 
@@ -136,12 +136,17 @@
                    paymentResponse.details.expiry_month);
          EXPECT_EQ(base::ASCIIToUTF16("2999"),
                    paymentResponse.details.expiry_year);
+         EXPECT_EQ(base::ASCIIToUTF16("123"),
+                   paymentResponse.details.card_security_code);
          EXPECT_EQ(coordinator, callerCoordinator);
        }];
   [coordinator setDelegate:delegate_mock];
 
-  // Call the controller delegate method.
-  [coordinator paymentRequestViewControllerDidConfirm:nil];
+  // Call the card unmasking delegate method.
+  std::unique_ptr<autofill::CreditCard> card =
+      payment_request_test_util::CreateTestCreditCard();
+  [coordinator fullCardRequestDidSucceedWithCard:*card
+                                             CVC:base::ASCIIToUTF16("123")];
 }
 
 // Tests that calling the ShippingAddressSelectionCoordinator delegate method
diff --git a/ios/chrome/browser/payments/payment_request_manager.h b/ios/chrome/browser/payments/payment_request_manager.h
index 9a7d9e72..6e7854e 100644
--- a/ios/chrome/browser/payments/payment_request_manager.h
+++ b/ios/chrome/browser/payments/payment_request_manager.h
@@ -28,6 +28,9 @@
 // The current web state being observed for PaymentRequest invocations.
 @property(nonatomic, assign) web::WebState* webState;
 
+// The ios::ChromeBrowserState instance passed to the initializer.
+@property(nonatomic, assign) ios::ChromeBrowserState* browserState;
+
 // Designated initializer.
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
                               browserState:
diff --git a/ios/chrome/browser/payments/payment_request_manager.mm b/ios/chrome/browser/payments/payment_request_manager.mm
index 3a4b2a0..f4cbdc0 100644
--- a/ios/chrome/browser/payments/payment_request_manager.mm
+++ b/ios/chrome/browser/payments/payment_request_manager.mm
@@ -12,7 +12,9 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/sys_string_conversions.h"
 #import "base/values.h"
+#include "components/autofill/core/browser/autofill_manager.h"
 #include "components/autofill/core/browser/personal_data_manager.h"
+#include "components/autofill/ios/browser/autofill_driver_ios.h"
 #include "ios/chrome/browser/autofill/personal_data_manager_factory.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/payments/js_payment_request_manager.h"
@@ -128,6 +130,7 @@
 
 @synthesize enabled = _enabled;
 @synthesize webState = _webState;
+@synthesize browserState = _browserState;
 
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
                               browserState:
@@ -135,6 +138,8 @@
   if ((self = [super init])) {
     _baseViewController.reset(viewController);
 
+    _browserState = browserState;
+
     _personalDataManager =
         autofill::PersonalDataManagerFactory::GetForBrowserState(
             browserState->GetOriginalChromeBrowserState());
@@ -307,9 +312,13 @@
   NSString* pageTitle = base::SysUTF16ToNSString([self webState]->GetTitle());
   NSString* pageHost =
       base::SysUTF8ToNSString([self webState]->GetLastCommittedURL().host());
+  autofill::AutofillManager* autofillManager =
+      autofill::AutofillDriverIOS::FromWebState(_webState)->autofill_manager();
   _paymentRequestCoordinator.reset([[PaymentRequestCoordinator alloc]
       initWithBaseViewController:_baseViewController]);
   [_paymentRequestCoordinator setPaymentRequest:_paymentRequest.get()];
+  [_paymentRequestCoordinator setAutofillManager:autofillManager];
+  [_paymentRequestCoordinator setBrowserState:_browserState];
   [_paymentRequestCoordinator setPageFavicon:pageFavicon];
   [_paymentRequestCoordinator setPageTitle:pageTitle];
   [_paymentRequestCoordinator setPageHost:pageHost];
diff --git a/ios/chrome/browser/payments/payment_request_view_controller.mm b/ios/chrome/browser/payments/payment_request_view_controller.mm
index 466c2d5..3daa2ca 100644
--- a/ios/chrome/browser/payments/payment_request_view_controller.mm
+++ b/ios/chrome/browser/payments/payment_request_view_controller.mm
@@ -181,16 +181,10 @@
 }
 
 - (void)onCancel {
-  [_cancelButton setEnabled:NO];
-  [_payButton setEnabled:NO];
-
   [_delegate paymentRequestViewControllerDidCancel:self];
 }
 
 - (void)onConfirm {
-  [_cancelButton setEnabled:NO];
-  [_payButton setEnabled:NO];
-
   [_delegate paymentRequestViewControllerDidConfirm:self];
 }
 
diff --git a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.h b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.h
index 7f55a97..7bf9c69 100644
--- a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.h
+++ b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.h
@@ -11,7 +11,7 @@
 #include "components/autofill/core/browser/ui/card_unmask_prompt_view.h"
 #import "ios/chrome/browser/ui/collection_view/collection_view_controller.h"
 
-@class CardUnmaskPromptViewIOS;
+@class CardUnmaskPromptViewController;
 
 namespace autofill {
 
@@ -35,13 +35,14 @@
   // Closes the view.
   void PerformClose();
 
-  // Deletes self. This should only be called by CardUnmaskPromptViewIOS after
-  // it finishes dismissing its own UI elements.
+  // Deletes self. This should only be called by CardUnmaskPromptViewController
+  // after it finishes dismissing its own UI elements.
   void DeleteSelf();
 
- private:
-  base::scoped_nsobject<CardUnmaskPromptViewIOS> view_;
+ protected:
+  base::scoped_nsobject<CardUnmaskPromptViewController> view_controller_;
 
+ private:
   // The controller |this| queries for logic and state.
   CardUnmaskPromptController* controller_;  // weak
 
@@ -52,7 +53,7 @@
 
 }  // namespace autofill
 
-@interface CardUnmaskPromptViewIOS : CollectionViewController
+@interface CardUnmaskPromptViewController : CollectionViewController
 
 // Designated initializer. |bridge| must not be null.
 - (instancetype)initWithBridge:(autofill::CardUnmaskPromptViewBridge*)bridge
diff --git a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
index a0b1fd8..ef0af332 100644
--- a/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
+++ b/ios/chrome/browser/ui/autofill/card_unmask_prompt_view_bridge.mm
@@ -63,11 +63,16 @@
 }
 
 void CardUnmaskPromptViewBridge::Show() {
-  view_.reset([[CardUnmaskPromptViewIOS alloc] initWithBridge:this]);
+  view_controller_.reset(
+      [[CardUnmaskPromptViewController alloc] initWithBridge:this]);
   // Present the view controller.
+  // TODO(crbug.com/692525): Find an alternative to presenting the view
+  // controller on the root view controller.
   UIViewController* rootController =
       [UIApplication sharedApplication].keyWindow.rootViewController;
-  [rootController presentViewController:view_ animated:YES completion:nil];
+  [rootController presentViewController:view_controller_
+                               animated:YES
+                             completion:nil];
 }
 
 void CardUnmaskPromptViewBridge::ControllerGone() {
@@ -76,23 +81,24 @@
 }
 
 void CardUnmaskPromptViewBridge::DisableAndWaitForVerification() {
-  [view_ showSpinner];
+  [view_controller_ showSpinner];
 }
 
 void CardUnmaskPromptViewBridge::GotVerificationResult(
     const base::string16& error_message,
     bool allow_retry) {
   if (error_message.empty()) {
-    [view_ showSuccess];
+    [view_controller_ showSuccess];
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE, base::Bind(&CardUnmaskPromptViewBridge::PerformClose,
                               weak_ptr_factory_.GetWeakPtr()),
         controller_->GetSuccessMessageDuration());
   } else {
     if (allow_retry) {
-      [view_ showCVCInputFormWithError:SysUTF16ToNSString(error_message)];
+      [view_controller_
+          showCVCInputFormWithError:SysUTF16ToNSString(error_message)];
     } else {
-      [view_ showError:SysUTF16ToNSString(error_message)];
+      [view_controller_ showError:SysUTF16ToNSString(error_message)];
     }
   }
 }
@@ -102,10 +108,10 @@
 }
 
 void CardUnmaskPromptViewBridge::PerformClose() {
-  [view_ dismissViewControllerAnimated:YES
-                            completion:^{
-                              this->DeleteSelf();
-                            }];
+  [view_controller_ dismissViewControllerAnimated:YES
+                                       completion:^{
+                                         this->DeleteSelf();
+                                       }];
 }
 
 void CardUnmaskPromptViewBridge::DeleteSelf() {
@@ -114,7 +120,7 @@
 
 }  // autofill
 
-@interface CardUnmaskPromptViewIOS ()<UITextFieldDelegate> {
+@interface CardUnmaskPromptViewController ()<UITextFieldDelegate> {
   UIBarButtonItem* _cancelButton;
   UIBarButtonItem* _verifyButton;
   CVCItem* _CVCItem;
@@ -132,7 +138,7 @@
 
 @end
 
-@implementation CardUnmaskPromptViewIOS
+@implementation CardUnmaskPromptViewController
 
 - (instancetype)initWithBridge:(autofill::CardUnmaskPromptViewBridge*)bridge {
   DCHECK(bridge);
diff --git a/mash/test/mash_test_suite.cc b/mash/test/mash_test_suite.cc
index 4a06e47..2f7a94d 100644
--- a/mash/test/mash_test_suite.cc
+++ b/mash/test/mash_test_suite.cc
@@ -63,7 +63,7 @@
   base::TestSuite::Initialize();
 
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
-      switches::kOverrideUseGLWithOSMesaForTests);
+      switches::kOverrideUseSoftwareGLForTests);
 
   // Load ash mus strings and resources; not 'common' (Chrome) resources.
   base::FilePath resources;
diff --git a/media/audio/audio_system.h b/media/audio/audio_system.h
index 76319cc..a11b030 100644
--- a/media/audio/audio_system.h
+++ b/media/audio/audio_system.h
@@ -25,26 +25,11 @@
 
   virtual ~AudioSystem();
 
-  // Callback may receive invalid parameters, it means the specified device is
-  // not found. This is best-effort: valid parameters do not guarantee existance
-  // of the device.
-  // TODO(olka,tommi): fix all AudioManager implementations to return invalid
-  // parameters if the device is not found.
+  // Callback will receive invalid parameters if the device is not found.
   virtual void GetInputStreamParameters(
       const std::string& device_id,
       OnAudioParamsCallback on_params_cb) const = 0;
 
-  // If media::AudioDeviceDescription::IsDefaultDevice(device_id) is true,
-  // callback will receive the parameters of the default output device.
-  // Callback may receive invalid parameters, it means the specified device is
-  // not found. This is best-effort: valid parameters do not guarantee existance
-  // of the device.
-  // TODO(olka,tommi): fix all AudioManager implementations to return invalid
-  // parameters if the device is not found.
-  virtual void GetOutputStreamParameters(
-      const std::string& device_id,
-      OnAudioParamsCallback on_params_cb) const = 0;
-
   virtual void HasInputDevices(OnBoolCallback on_has_devices_cb) const = 0;
 
   // Must not be used for anything but stream creation.
diff --git a/media/audio/audio_system_impl.cc b/media/audio/audio_system_impl.cc
index a6c51a6..fdffa70f 100644
--- a/media/audio/audio_system_impl.cc
+++ b/media/audio/audio_system_impl.cc
@@ -7,7 +7,6 @@
 #include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/task_runner_util.h"
-#include "media/audio/audio_device_description.h"
 #include "media/audio/audio_manager.h"
 
 // Using base::Unretained for |audio_manager_| is safe since it is deleted after
@@ -22,29 +21,13 @@
   DCHECK(audio_manager->GetTaskRunner()->BelongsToCurrentThread());
 
   // TODO(olka): remove this when AudioManager::GetInputStreamParameters()
-  // returns invalid parameters if the device is not found.
+  // works this way on all the platforms.
   if (!audio_manager->HasAudioInputDevices())
     return AudioParameters();
 
   return audio_manager->GetInputStreamParameters(device_id);
 }
 
-AudioParameters GetOutputParametersOnDeviceThread(
-    AudioManager* audio_manager,
-    const std::string& device_id) {
-  DCHECK(audio_manager->GetTaskRunner()->BelongsToCurrentThread());
-
-  // TODO(olka): remove this when
-  // AudioManager::Get[Default]OutputStreamParameters() returns invalid
-  // parameters if the device is not found.
-  if (!audio_manager->HasAudioOutputDevices())
-    return AudioParameters();
-
-  return media::AudioDeviceDescription::IsDefaultDevice(device_id)
-             ? audio_manager->GetDefaultOutputStreamParameters()
-             : audio_manager->GetOutputStreamParameters(device_id);
-}
-
 }  // namespace
 
 AudioSystemImpl::AudioSystemImpl(AudioManager* audio_manager)
@@ -79,22 +62,6 @@
       std::move(on_params_cb));
 }
 
-void AudioSystemImpl::GetOutputStreamParameters(
-    const std::string& device_id,
-    OnAudioParamsCallback on_params_cb) const {
-  if (GetTaskRunner()->BelongsToCurrentThread()) {
-    GetTaskRunner()->PostTask(
-        FROM_HERE, base::Bind(on_params_cb, GetOutputParametersOnDeviceThread(
-                                                audio_manager_, device_id)));
-    return;
-  }
-  base::PostTaskAndReplyWithResult(
-      GetTaskRunner(), FROM_HERE,
-      base::Bind(&GetOutputParametersOnDeviceThread,
-                 base::Unretained(audio_manager_), device_id),
-      std::move(on_params_cb));
-}
-
 void AudioSystemImpl::HasInputDevices(OnBoolCallback on_has_devices_cb) const {
   if (GetTaskRunner()->BelongsToCurrentThread()) {
     GetTaskRunner()->PostTask(
diff --git a/media/audio/audio_system_impl.h b/media/audio/audio_system_impl.h
index dd9342c..e7efd10 100644
--- a/media/audio/audio_system_impl.h
+++ b/media/audio/audio_system_impl.h
@@ -24,13 +24,7 @@
   void GetInputStreamParameters(
       const std::string& device_id,
       OnAudioParamsCallback on_params_cb) const override;
-
-  void GetOutputStreamParameters(
-      const std::string& device_id,
-      OnAudioParamsCallback on_params_cb) const override;
-
   void HasInputDevices(OnBoolCallback on_has_devices_cb) const override;
-
   AudioManager* GetAudioManager() const override;
 
  protected:
diff --git a/media/audio/audio_system_impl_unittest.cc b/media/audio/audio_system_impl_unittest.cc
index ba4de57..04f6f64 100644
--- a/media/audio/audio_system_impl_unittest.cc
+++ b/media/audio/audio_system_impl_unittest.cc
@@ -16,31 +16,12 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace {
-const char* kNonDefaultDeviceId = "non-default-device-id";
-}
 namespace media {
 
 class AudioSystemImplTest : public testing::TestWithParam<bool> {
  public:
   AudioSystemImplTest()
-      : use_audio_thread_(GetParam()),
-        audio_thread_("AudioSystemThread"),
-        input_params_(AudioParameters::AUDIO_PCM_LINEAR,
-                      CHANNEL_LAYOUT_MONO,
-                      AudioParameters::kTelephoneSampleRate,
-                      16,
-                      AudioParameters::kTelephoneSampleRate / 10),
-        output_params_(AudioParameters::AUDIO_PCM_LINEAR,
-                       CHANNEL_LAYOUT_MONO,
-                       AudioParameters::kTelephoneSampleRate,
-                       16,
-                       AudioParameters::kTelephoneSampleRate / 20),
-        default_output_params_(AudioParameters::AUDIO_PCM_LINEAR,
-                               CHANNEL_LAYOUT_MONO,
-                               AudioParameters::kTelephoneSampleRate,
-                               16,
-                               AudioParameters::kTelephoneSampleRate / 30) {
+      : use_audio_thread_(GetParam()), audio_thread_("AudioSystemThread") {
     if (use_audio_thread_) {
       audio_thread_.StartAndWaitForTesting();
       audio_manager_.reset(
@@ -49,11 +30,8 @@
       audio_manager_.reset(new media::MockAudioManager(
           base::ThreadTaskRunnerHandle::Get().get()));
     }
-
-    audio_manager_->SetInputStreamParameters(input_params_);
-    audio_manager_->SetOutputStreamParameters(output_params_);
-    audio_manager_->SetDefaultOutputStreamParameters(default_output_params_);
-
+    audio_manager_->SetInputStreamParameters(
+        media::AudioParameters::UnavailableDeviceParams());
     audio_system_ = media::AudioSystemImpl::Create(audio_manager_.get());
     EXPECT_EQ(AudioSystem::Get(), audio_system_.get());
   }
@@ -74,17 +52,12 @@
     AudioParametersReceived();
   }
 
-  void OnHasInputDevices(bool result) {
-    EXPECT_TRUE(thread_checker_.CalledOnValidThread());
-    HasInputDevicesCallback(result);
-  }
-
   void WaitForCallback() {
     if (!use_audio_thread_) {
       base::RunLoop().RunUntilIdle();
       return;
     }
-    WaitableMessageLoopEvent event;
+    media::WaitableMessageLoopEvent event;
     audio_thread_.task_runner()->PostTaskAndReply(
         FROM_HERE, base::Bind(&base::DoNothing), event.GetClosure());
     // Runs the loop and waits for the |audio_thread_| to call event's closure,
@@ -104,9 +77,6 @@
   base::Thread audio_thread_;
   MockAudioManager::UniquePtr audio_manager_;
   std::unique_ptr<media::AudioSystem> audio_system_;
-  AudioParameters input_params_;
-  AudioParameters output_params_;
-  AudioParameters default_output_params_;
 };
 
 TEST_P(AudioSystemImplTest, GetInputStreamParameters) {
@@ -114,7 +84,7 @@
   audio_system_->GetInputStreamParameters(
       media::AudioDeviceDescription::kDefaultDeviceId,
       base::Bind(&AudioSystemImplTest::OnAudioParams, base::Unretained(this),
-                 input_params_));
+                 media::AudioParameters::UnavailableDeviceParams()));
   WaitForCallback();
 }
 
@@ -128,44 +98,10 @@
   WaitForCallback();
 }
 
-TEST_P(AudioSystemImplTest, GetStreamParameters) {
-  EXPECT_CALL(*this, AudioParametersReceived());
-  audio_system_->GetOutputStreamParameters(
-      kNonDefaultDeviceId, base::Bind(&AudioSystemImplTest::OnAudioParams,
-                                      base::Unretained(this), output_params_));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetDefaultOutputStreamParameters) {
-  EXPECT_CALL(*this, AudioParametersReceived());
-  audio_system_->GetOutputStreamParameters(
-      media::AudioDeviceDescription::kDefaultDeviceId,
-      base::Bind(&AudioSystemImplTest::OnAudioParams, base::Unretained(this),
-                 default_output_params_));
-  WaitForCallback();
-}
-
-TEST_P(AudioSystemImplTest, GetOutputStreamParametersNoDevice) {
-  audio_manager_->SetHasOutputDevices(false);
-  EXPECT_CALL(*this, AudioParametersReceived()).Times(2);
-
-  audio_system_->GetOutputStreamParameters(
-      media::AudioDeviceDescription::kDefaultDeviceId,
-      base::Bind(&AudioSystemImplTest::OnAudioParams, base::Unretained(this),
-                 media::AudioParameters()));
-  WaitForCallback();
-
-  audio_system_->GetOutputStreamParameters(
-      kNonDefaultDeviceId,
-      base::Bind(&AudioSystemImplTest::OnAudioParams, base::Unretained(this),
-                 media::AudioParameters()));
-  WaitForCallback();
-}
-
 TEST_P(AudioSystemImplTest, HasInputDevices) {
   EXPECT_CALL(*this, HasInputDevicesCallback(true));
   audio_system_->HasInputDevices(base::Bind(
-      &AudioSystemImplTest::OnHasInputDevices, base::Unretained(this)));
+      &AudioSystemImplTest::HasInputDevicesCallback, base::Unretained(this)));
   WaitForCallback();
 }
 
@@ -173,7 +109,7 @@
   audio_manager_->SetHasInputDevices(false);
   EXPECT_CALL(*this, HasInputDevicesCallback(false));
   audio_system_->HasInputDevices(base::Bind(
-      &AudioSystemImplTest::OnHasInputDevices, base::Unretained(this)));
+      &AudioSystemImplTest::HasInputDevicesCallback, base::Unretained(this)));
   WaitForCallback();
 }
 
diff --git a/media/audio/mock_audio_manager.cc b/media/audio/mock_audio_manager.cc
index 9dcb9e5..931cdbb7 100644
--- a/media/audio/mock_audio_manager.cc
+++ b/media/audio/mock_audio_manager.cc
@@ -32,7 +32,7 @@
 
 bool MockAudioManager::HasAudioOutputDevices() {
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
-  return has_output_devices_;
+  return true;
 }
 
 bool MockAudioManager::HasAudioInputDevices() {
@@ -90,13 +90,13 @@
 }
 
 AudioParameters MockAudioManager::GetDefaultOutputStreamParameters() {
-  return default_output_params_;
+  return AudioParameters();
 }
 
 AudioParameters MockAudioManager::GetOutputStreamParameters(
       const std::string& device_id) {
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
-  return output_params_;
+  return AudioParameters();
 }
 
 AudioParameters MockAudioManager::GetInputStreamParameters(
@@ -120,26 +120,13 @@
   return nullptr;
 }
 
-void MockAudioManager::SetInputStreamParameters(const AudioParameters& params) {
-  input_params_ = params;
-}
-
-void MockAudioManager::SetOutputStreamParameters(
-    const AudioParameters& params) {
-  output_params_ = params;
-}
-
-void MockAudioManager::SetDefaultOutputStreamParameters(
-    const AudioParameters& params) {
-  default_output_params_ = params;
+void MockAudioManager::SetInputStreamParameters(
+    const AudioParameters& input_params) {
+  input_params_ = input_params;
 }
 
 void MockAudioManager::SetHasInputDevices(bool has_input_devices) {
   has_input_devices_ = has_input_devices;
 }
 
-void MockAudioManager::SetHasOutputDevices(bool has_output_devices) {
-  has_output_devices_ = has_output_devices;
-}
-
 }  // namespace media.
diff --git a/media/audio/mock_audio_manager.h b/media/audio/mock_audio_manager.h
index 619398d..ae5bd50 100644
--- a/media/audio/mock_audio_manager.h
+++ b/media/audio/mock_audio_manager.h
@@ -72,23 +72,16 @@
   const char* GetName() override;
 
   // Setters to emulate desired in-test behavior.
-  void SetInputStreamParameters(const AudioParameters& params);
-  void SetOutputStreamParameters(const AudioParameters& params);
-  void SetDefaultOutputStreamParameters(const AudioParameters& params);
+  void SetInputStreamParameters(const AudioParameters& input_params);
   void SetHasInputDevices(bool has_input_devices);
-  void SetHasOutputDevices(bool has_output_devices);
 
  protected:
   ~MockAudioManager() override;
 
  private:
   friend class base::DeleteHelper<MockAudioManager>;
-
   AudioParameters input_params_;
-  AudioParameters output_params_;
-  AudioParameters default_output_params_;
   bool has_input_devices_ = true;
-  bool has_output_devices_ = true;
 
   DISALLOW_COPY_AND_ASSIGN(MockAudioManager);
 };
diff --git a/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java b/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java
index f99b890..3ea393f7 100644
--- a/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java
+++ b/media/base/android/java/src/org/chromium/media/CodecProfileLevelList.java
@@ -179,7 +179,7 @@
                     case CodecProfileLevel.AVCLevel12:
                         return 12;
                     case CodecProfileLevel.AVCLevel13:
-                        return 14;
+                        return 13;
                     case CodecProfileLevel.AVCLevel2:
                         return 20;
                     case CodecProfileLevel.AVCLevel21:
diff --git a/net/BUILD.gn b/net/BUILD.gn
index a5b3c20d..26c4b38 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -4370,6 +4370,7 @@
     "nqe/network_quality_estimator_unittest.cc",
     "nqe/network_quality_store_unittest.cc",
     "nqe/observation_buffer_unittest.cc",
+    "nqe/socket_watcher_unittest.cc",
     "nqe/throughput_analyzer_unittest.cc",
     "proxy/dhcp_proxy_script_adapter_fetcher_win_unittest.cc",
     "proxy/dhcp_proxy_script_fetcher_factory_unittest.cc",
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc
index c92ed5286..08499e2 100644
--- a/net/nqe/network_quality_estimator.cc
+++ b/net/nqe/network_quality_estimator.cc
@@ -326,8 +326,10 @@
 
   watcher_factory_.reset(new nqe::internal::SocketWatcherFactory(
       base::ThreadTaskRunnerHandle::Get(),
+      nqe::internal::GetMinSocketWatcherNotificationInterval(variation_params),
       base::Bind(&NetworkQualityEstimator::OnUpdatedRTTAvailable,
-                 base::Unretained(this))));
+                 base::Unretained(this)),
+      tick_clock_.get()));
 
   // Record accuracy after a 15 second interval. The values used here must
   // remain in sync with the suffixes specified in
diff --git a/net/nqe/network_quality_estimator_params.cc b/net/nqe/network_quality_estimator_params.cc
index 8a76bdde..63ace63 100644
--- a/net/nqe/network_quality_estimator_params.cc
+++ b/net/nqe/network_quality_estimator_params.cc
@@ -379,6 +379,13 @@
   return true;
 }
 
+base::TimeDelta GetMinSocketWatcherNotificationInterval(
+    const std::map<std::string, std::string>& variation_params) {
+  // Use 1000 milliseconds as the default value.
+  return base::TimeDelta::FromMilliseconds(GetValueForVariationParam(
+      variation_params, "min_socket_watcher_notification_interval_msec", 1000));
+}
+
 }  // namespace internal
 
 }  // namespace nqe
diff --git a/net/nqe/network_quality_estimator_params.h b/net/nqe/network_quality_estimator_params.h
index f9dcd0c0..6d7310f9 100644
--- a/net/nqe/network_quality_estimator_params.h
+++ b/net/nqe/network_quality_estimator_params.h
@@ -78,6 +78,11 @@
 bool persistent_cache_reading_enabled(
     const std::map<std::string, std::string>& variation_params);
 
+// Returns the the minimum interval betweeen consecutive notifications to a
+// single socket watcher.
+base::TimeDelta GetMinSocketWatcherNotificationInterval(
+    const std::map<std::string, std::string>& variation_params);
+
 }  // namespace internal
 
 }  // namespace nqe
diff --git a/net/nqe/socket_watcher.cc b/net/nqe/socket_watcher.cc
index d03b98ec..174c388 100644
--- a/net/nqe/socket_watcher.cc
+++ b/net/nqe/socket_watcher.cc
@@ -7,6 +7,7 @@
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
+#include "base/time/tick_clock.h"
 #include "base/time/time.h"
 
 namespace net {
@@ -17,23 +18,34 @@
 
 SocketWatcher::SocketWatcher(
     SocketPerformanceWatcherFactory::Protocol protocol,
+    base::TimeDelta min_notification_interval,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    OnUpdatedRTTAvailableCallback updated_rtt_observation_callback)
+    OnUpdatedRTTAvailableCallback updated_rtt_observation_callback,
+    base::TickClock* tick_clock)
     : protocol_(protocol),
       task_runner_(std::move(task_runner)),
-      updated_rtt_observation_callback_(updated_rtt_observation_callback) {}
+      updated_rtt_observation_callback_(updated_rtt_observation_callback),
+      rtt_notifications_minimum_interval_(min_notification_interval),
+      tick_clock_(tick_clock) {
+  DCHECK(tick_clock_);
+}
 
 SocketWatcher::~SocketWatcher() {}
 
 bool SocketWatcher::ShouldNotifyUpdatedRTT() const {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  return true;
+  // Do not allow incoming notifications if the last notification was more
+  // recent than |rtt_notifications_minimum_interval_| ago. This helps in
+  // reducing the overhead of obtaining the RTT values.
+  return tick_clock_->NowTicks() - last_rtt_notification_ >=
+         rtt_notifications_minimum_interval_;
 }
 
 void SocketWatcher::OnUpdatedRTTAvailable(const base::TimeDelta& rtt) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
+  last_rtt_notification_ = tick_clock_->NowTicks();
   task_runner_->PostTask(
       FROM_HERE, base::Bind(updated_rtt_observation_callback_, protocol_, rtt));
 }
diff --git a/net/nqe/socket_watcher.h b/net/nqe/socket_watcher.h
index 09b8a393..9c4a578 100644
--- a/net/nqe/socket_watcher.h
+++ b/net/nqe/socket_watcher.h
@@ -5,15 +5,20 @@
 #ifndef NET_NQE_SOCKET_WATCHER_H_
 #define NET_NQE_SOCKET_WATCHER_H_
 
+#include <memory>
+
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
+#include "base/time/time.h"
+#include "net/base/net_export.h"
 #include "net/socket/socket_performance_watcher.h"
 #include "net/socket/socket_performance_watcher_factory.h"
 
 namespace base {
 class SingleThreadTaskRunner;
+class TickClock;
 class TimeDelta;
 }  // namespace base
 
@@ -30,15 +35,19 @@
 namespace internal {
 
 // SocketWatcher implements SocketPerformanceWatcher, and is not thread-safe.
-class SocketWatcher : public SocketPerformanceWatcher {
+class NET_EXPORT_PRIVATE SocketWatcher : public SocketPerformanceWatcher {
  public:
   // Creates a SocketWatcher which can be used to watch a socket that uses
   // |protocol| as the transport layer protocol. The socket watcher will call
   // |updated_rtt_observation_callback| on |task_runner| every time a new RTT
-  // observation is available.
+  // observation is available. |min_notification_interval| is the minimum
+  // interval betweeen consecutive notifications to this socket watcher.
+  // |tick_clock| is guaranteed to be non-null.
   SocketWatcher(SocketPerformanceWatcherFactory::Protocol protocol,
+                base::TimeDelta min_notification_interval,
                 scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-                OnUpdatedRTTAvailableCallback updated_rtt_observation_callback);
+                OnUpdatedRTTAvailableCallback updated_rtt_observation_callback,
+                base::TickClock* tick_clock);
 
   ~SocketWatcher() override;
 
@@ -56,6 +65,14 @@
   // Called every time a new RTT observation is available.
   OnUpdatedRTTAvailableCallback updated_rtt_observation_callback_;
 
+  // Minimum interval betweeen consecutive incoming notifications.
+  const base::TimeDelta rtt_notifications_minimum_interval_;
+
+  // Time when this was last notified of updated RTT.
+  base::TimeTicks last_rtt_notification_;
+
+  base::TickClock* tick_clock_;
+
   base::ThreadChecker thread_checker_;
 
   DISALLOW_COPY_AND_ASSIGN(SocketWatcher);
diff --git a/net/nqe/socket_watcher_factory.cc b/net/nqe/socket_watcher_factory.cc
index 88fa5a94..496dd9b 100644
--- a/net/nqe/socket_watcher_factory.cc
+++ b/net/nqe/socket_watcher_factory.cc
@@ -4,6 +4,7 @@
 
 #include "net/nqe/socket_watcher_factory.h"
 
+#include "base/memory/ptr_util.h"
 #include "base/time/time.h"
 #include "net/nqe/socket_watcher.h"
 
@@ -15,16 +16,23 @@
 
 SocketWatcherFactory::SocketWatcherFactory(
     scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    OnUpdatedRTTAvailableCallback updated_rtt_observation_callback)
+    base::TimeDelta min_notification_interval,
+    OnUpdatedRTTAvailableCallback updated_rtt_observation_callback,
+    base::TickClock* tick_clock)
     : task_runner_(std::move(task_runner)),
-      updated_rtt_observation_callback_(updated_rtt_observation_callback) {}
+      min_notification_interval_(min_notification_interval),
+      updated_rtt_observation_callback_(updated_rtt_observation_callback),
+      tick_clock_(tick_clock) {
+  DCHECK(tick_clock_);
+}
 
 SocketWatcherFactory::~SocketWatcherFactory() {}
 
 std::unique_ptr<SocketPerformanceWatcher>
 SocketWatcherFactory::CreateSocketPerformanceWatcher(const Protocol protocol) {
-  return std::unique_ptr<SocketPerformanceWatcher>(new SocketWatcher(
-      protocol, task_runner_, updated_rtt_observation_callback_));
+  return base::MakeUnique<SocketWatcher>(
+      protocol, min_notification_interval_, task_runner_,
+      updated_rtt_observation_callback_, tick_clock_);
 }
 
 }  // namespace internal
diff --git a/net/nqe/socket_watcher_factory.h b/net/nqe/socket_watcher_factory.h
index 5cffb72..e4fd23f 100644
--- a/net/nqe/socket_watcher_factory.h
+++ b/net/nqe/socket_watcher_factory.h
@@ -12,10 +12,12 @@
 #include "base/memory/weak_ptr.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
+#include "base/time/time.h"
 #include "net/socket/socket_performance_watcher.h"
 #include "net/socket/socket_performance_watcher_factory.h"
 
 namespace base {
+class TickClock;
 class TimeDelta;
 }  // namespace base
 
@@ -38,9 +40,14 @@
   // Creates a SocketWatcherFactory.  All socket watchers created by
   // SocketWatcherFactory call |updated_rtt_observation_callback| on
   // |task_runner| every time a new RTT observation is available.
+  // |min_notification_interval| is the minimum interval betweeen consecutive
+  // notifications to the socket watchers created by this factory. |tick_clock|
+  // is guaranteed to be non-null.
   SocketWatcherFactory(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-      OnUpdatedRTTAvailableCallback updated_rtt_observation_callback);
+      base::TimeDelta min_notification_interval,
+      OnUpdatedRTTAvailableCallback updated_rtt_observation_callback,
+      base::TickClock* tick_clock);
 
   ~SocketWatcherFactory() override;
 
@@ -51,9 +58,15 @@
  private:
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
+  // Minimum interval betweeen consecutive notifications to the socket watchers
+  // created by this factory.
+  const base::TimeDelta min_notification_interval_;
+
   // Called every time a new RTT observation is available.
   OnUpdatedRTTAvailableCallback updated_rtt_observation_callback_;
 
+  base::TickClock* tick_clock_;
+
   DISALLOW_COPY_AND_ASSIGN(SocketWatcherFactory);
 };
 
diff --git a/net/nqe/socket_watcher_unittest.cc b/net/nqe/socket_watcher_unittest.cc
new file mode 100644
index 0000000..e2eab8f6d
--- /dev/null
+++ b/net/nqe/socket_watcher_unittest.cc
@@ -0,0 +1,57 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/nqe/socket_watcher.h"
+
+#include "base/bind.h"
+#include "base/test/simple_test_tick_clock.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/time/time.h"
+#include "net/socket/socket_performance_watcher.h"
+#include "net/socket/socket_performance_watcher_factory.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+namespace {
+
+void OnUpdatedRTTAvailable(SocketPerformanceWatcherFactory::Protocol protocol,
+                           const base::TimeDelta& rtt) {}
+
+// Verify that the buffer size is never exceeded.
+TEST(NetworkQualitySocketWatcherTest, NotificationsThrottled) {
+  base::SimpleTestTickClock tick_clock;
+  tick_clock.SetNowTicks(base::TimeTicks::Now());
+
+  SocketWatcher socket_watcher(SocketPerformanceWatcherFactory::PROTOCOL_QUIC,
+                               base::TimeDelta::FromMilliseconds(2000),
+                               base::ThreadTaskRunnerHandle::Get(),
+                               base::Bind(OnUpdatedRTTAvailable), &tick_clock);
+
+  EXPECT_TRUE(socket_watcher.ShouldNotifyUpdatedRTT());
+  socket_watcher.OnUpdatedRTTAvailable(base::TimeDelta::FromSeconds(10));
+
+  EXPECT_FALSE(socket_watcher.ShouldNotifyUpdatedRTT());
+
+  tick_clock.Advance(base::TimeDelta::FromMilliseconds(1000));
+  // Minimum interval between consecutive notifications is 2000 msec.
+  EXPECT_FALSE(socket_watcher.ShouldNotifyUpdatedRTT());
+
+  // Advance the clock by 1000 msec more so that the current time is at least
+  // 2000 msec more than the last time |socket_watcher| received a notification.
+  tick_clock.Advance(base::TimeDelta::FromMilliseconds(1000));
+  EXPECT_TRUE(socket_watcher.ShouldNotifyUpdatedRTT());
+}
+
+}  // namespace
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
\ No newline at end of file
diff --git a/net/quic/chromium/quic_connection_logger.cc b/net/quic/chromium/quic_connection_logger.cc
index 1e451e3..27128a3 100644
--- a/net/quic/chromium/quic_connection_logger.cc
+++ b/net/quic/chromium/quic_connection_logger.cc
@@ -686,7 +686,8 @@
     return;
 
   int64_t microseconds = rtt.ToMicroseconds();
-  if (microseconds != 0) {
+  if (microseconds != 0 &&
+      socket_performance_watcher_->ShouldNotifyUpdatedRTT()) {
     socket_performance_watcher_->OnUpdatedRTTAvailable(
         base::TimeDelta::FromMicroseconds(rtt.ToMicroseconds()));
   }
diff --git a/net/quic/chromium/quic_network_transaction_unittest.cc b/net/quic/chromium/quic_network_transaction_unittest.cc
index 0021013..611247e 100644
--- a/net/quic/chromium/quic_network_transaction_unittest.cc
+++ b/net/quic/chromium/quic_network_transaction_unittest.cc
@@ -153,11 +153,15 @@
 
 class TestSocketPerformanceWatcher : public SocketPerformanceWatcher {
  public:
-  explicit TestSocketPerformanceWatcher(bool* rtt_notification_received)
-      : rtt_notification_received_(rtt_notification_received) {}
+  TestSocketPerformanceWatcher(bool* should_notify_updated_rtt,
+                               bool* rtt_notification_received)
+      : should_notify_updated_rtt_(should_notify_updated_rtt),
+        rtt_notification_received_(rtt_notification_received) {}
   ~TestSocketPerformanceWatcher() override {}
 
-  bool ShouldNotifyUpdatedRTT() const override { return true; }
+  bool ShouldNotifyUpdatedRTT() const override {
+    return *should_notify_updated_rtt_;
+  }
 
   void OnUpdatedRTTAvailable(const base::TimeDelta& rtt) override {
     *rtt_notification_received_ = true;
@@ -166,6 +170,7 @@
   void OnConnectionChanged() override {}
 
  private:
+  bool* should_notify_updated_rtt_;
   bool* rtt_notification_received_;
 
   DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcher);
@@ -175,7 +180,9 @@
     : public SocketPerformanceWatcherFactory {
  public:
   TestSocketPerformanceWatcherFactory()
-      : watcher_count_(0u), rtt_notification_received_(false) {}
+      : watcher_count_(0u),
+        should_notify_updated_rtt_(true),
+        rtt_notification_received_(false) {}
   ~TestSocketPerformanceWatcherFactory() override {}
 
   // SocketPerformanceWatcherFactory implementation:
@@ -186,15 +193,21 @@
     }
     ++watcher_count_;
     return std::unique_ptr<SocketPerformanceWatcher>(
-        new TestSocketPerformanceWatcher(&rtt_notification_received_));
+        new TestSocketPerformanceWatcher(&should_notify_updated_rtt_,
+                                         &rtt_notification_received_));
   }
 
   size_t watcher_count() const { return watcher_count_; }
 
   bool rtt_notification_received() const { return rtt_notification_received_; }
 
+  void set_should_notify_updated_rtt(bool should_notify_updated_rtt) {
+    should_notify_updated_rtt_ = should_notify_updated_rtt;
+  }
+
  private:
   size_t watcher_count_;
+  bool should_notify_updated_rtt_;
   bool rtt_notification_received_;
 
   DISALLOW_COPY_AND_ASSIGN(TestSocketPerformanceWatcherFactory);
@@ -754,6 +767,68 @@
                         QuicNetworkTransactionTest,
                         ::testing::ValuesIn(AllSupportedVersions()));
 
+TEST_P(QuicNetworkTransactionTest, SocketWatcherEnabled) {
+  params_.origins_to_force_quic_on.insert(
+      HostPortPair::FromString("mail.example.org:443"));
+
+  MockQuicData mock_quic_data;
+  QuicStreamOffset header_stream_offset = 0;
+  mock_quic_data.AddWrite(ConstructSettingsPacket(
+      1, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize,
+      &header_stream_offset));
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      2, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/"), &header_stream_offset));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
+      1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(3, 2, 1));
+  mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // No more data to read
+
+  mock_quic_data.AddSocketDataToFactory(&socket_factory_);
+
+  CreateSession();
+  test_socket_performance_watcher_factory_.set_should_notify_updated_rtt(true);
+
+  EXPECT_FALSE(
+      test_socket_performance_watcher_factory_.rtt_notification_received());
+  SendRequestAndExpectQuicResponse("hello!");
+  EXPECT_TRUE(
+      test_socket_performance_watcher_factory_.rtt_notification_received());
+}
+
+TEST_P(QuicNetworkTransactionTest, SocketWatcherDisabled) {
+  params_.origins_to_force_quic_on.insert(
+      HostPortPair::FromString("mail.example.org:443"));
+
+  MockQuicData mock_quic_data;
+  QuicStreamOffset header_stream_offset = 0;
+  mock_quic_data.AddWrite(ConstructSettingsPacket(
+      1, SETTINGS_MAX_HEADER_LIST_SIZE, kDefaultMaxUncompressedHeaderSize,
+      &header_stream_offset));
+  mock_quic_data.AddWrite(ConstructClientRequestHeadersPacket(
+      2, kClientDataStreamId1, true, true,
+      GetRequestHeaders("GET", "https", "/"), &header_stream_offset));
+  mock_quic_data.AddRead(ConstructServerResponseHeadersPacket(
+      1, kClientDataStreamId1, false, false, GetResponseHeaders("200 OK")));
+  mock_quic_data.AddRead(ConstructServerDataPacket(2, kClientDataStreamId1,
+                                                   false, true, 0, "hello!"));
+  mock_quic_data.AddWrite(ConstructClientAckPacket(3, 2, 1));
+  mock_quic_data.AddRead(SYNCHRONOUS, ERR_IO_PENDING);  // No more data to read
+
+  mock_quic_data.AddSocketDataToFactory(&socket_factory_);
+
+  CreateSession();
+  test_socket_performance_watcher_factory_.set_should_notify_updated_rtt(false);
+
+  EXPECT_FALSE(
+      test_socket_performance_watcher_factory_.rtt_notification_received());
+  SendRequestAndExpectQuicResponse("hello!");
+  EXPECT_FALSE(
+      test_socket_performance_watcher_factory_.rtt_notification_received());
+}
+
 TEST_P(QuicNetworkTransactionTest, ForceQuic) {
   params_.origins_to_force_quic_on.insert(
       HostPortPair::FromString("mail.example.org:443"));
@@ -777,11 +852,7 @@
 
   CreateSession();
 
-  EXPECT_FALSE(
-      test_socket_performance_watcher_factory_.rtt_notification_received());
   SendRequestAndExpectQuicResponse("hello!");
-  EXPECT_TRUE(
-      test_socket_performance_watcher_factory_.rtt_notification_received());
 
   // Check that the NetLog was filled reasonably.
   TestNetLogEntry::List entries;
diff --git a/net/socket/tcp_socket_posix.cc b/net/socket/tcp_socket_posix.cc
index 1e4f6edd..438d5aa 100644
--- a/net/socket/tcp_socket_posix.cc
+++ b/net/socket/tcp_socket_posix.cc
@@ -15,7 +15,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/task_scheduler/post_task.h"
-#include "base/time/default_tick_clock.h"
+#include "base/time/time.h"
 #include "net/base/address_list.h"
 #include "net/base/io_buffer.h"
 #include "net/base/ip_endpoint.h"
@@ -144,8 +144,6 @@
     NetLog* net_log,
     const NetLogSource& source)
     : socket_performance_watcher_(std::move(socket_performance_watcher)),
-      tick_clock_(new base::DefaultTickClock()),
-      rtt_notifications_minimum_interval_(base::TimeDelta::FromSeconds(1)),
       use_tcp_fastopen_(false),
       tcp_fastopen_write_attempted_(false),
       tcp_fastopen_connected_(false),
@@ -483,11 +481,6 @@
   }
 }
 
-void TCPSocketPosix::SetTickClockForTesting(
-    std::unique_ptr<base::TickClock> tick_clock) {
-  tick_clock_ = std::move(tick_clock);
-}
-
 void TCPSocketPosix::AcceptCompleted(
     std::unique_ptr<TCPSocketPosix>* tcp_socket,
     IPEndPoint* address,
@@ -723,13 +716,6 @@
 
 void TCPSocketPosix::NotifySocketPerformanceWatcher() {
 #if defined(TCP_INFO)
-  const base::TimeTicks now_ticks = tick_clock_->NowTicks();
-  // Do not notify |socket_performance_watcher_| if the last notification was
-  // recent than |rtt_notifications_minimum_interval_| ago. This helps in
-  // reducing the overall overhead of the tcp_info syscalls.
-  if (now_ticks - last_rtt_notification_ < rtt_notifications_minimum_interval_)
-    return;
-
   // Check if |socket_performance_watcher_| is interested in receiving a RTT
   // update notification.
   if (!socket_performance_watcher_ ||
@@ -751,7 +737,6 @@
 
   socket_performance_watcher_->OnUpdatedRTTAvailable(
       base::TimeDelta::FromMicroseconds(info.tcpi_rtt));
-  last_rtt_notification_ = now_ticks;
 #endif  // defined(TCP_INFO)
 }
 
diff --git a/net/socket/tcp_socket_posix.h b/net/socket/tcp_socket_posix.h
index fda90fcf..93b8261 100644
--- a/net/socket/tcp_socket_posix.h
+++ b/net/socket/tcp_socket_posix.h
@@ -12,7 +12,6 @@
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
-#include "base/time/time.h"
 #include "net/base/address_family.h"
 #include "net/base/completion_callback.h"
 #include "net/base/net_export.h"
@@ -20,7 +19,7 @@
 #include "net/socket/socket_performance_watcher.h"
 
 namespace base {
-class TickClock;
+class TimeDelta;
 }
 
 namespace net {
@@ -108,8 +107,6 @@
   void StartLoggingMultipleConnectAttempts(const AddressList& addresses);
   void EndLoggingMultipleConnectAttempts(int net_error);
 
-  void SetTickClockForTesting(std::unique_ptr<base::TickClock> tick_clock);
-
   const NetLogWithSource& net_log() const { return net_log_; }
 
  private:
@@ -224,16 +221,6 @@
   // |socket_performance_watcher_|. May be nullptr.
   std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher_;
 
-  std::unique_ptr<base::TickClock> tick_clock_;
-
-  // Minimum interval betweeen consecutive notifications to
-  // |socket_performance_watcher_|.
-  const base::TimeDelta rtt_notifications_minimum_interval_;
-
-  // Time when the |socket_performance_watcher_| was last notified of updated
-  // RTT.
-  base::TimeTicks last_rtt_notification_;
-
   // Enables experimental TCP FastOpen option.
   bool use_tcp_fastopen_;
 
diff --git a/net/socket/tcp_socket_unittest.cc b/net/socket/tcp_socket_unittest.cc
index b783e94..d9da13c 100644
--- a/net/socket/tcp_socket_unittest.cc
+++ b/net/socket/tcp_socket_unittest.cc
@@ -12,7 +12,6 @@
 #include <vector>
 
 #include "base/memory/ref_counted.h"
-#include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "net/base/address_list.h"
 #include "net/base/io_buffer.h"
@@ -116,27 +115,20 @@
 
 #if defined(TCP_INFO) || defined(OS_LINUX)
   // Tests that notifications to Socket Performance Watcher (SPW) are delivered
-  // correctly. |advance_ticks| is the duration by which the clock is advanced
-  // before a message is read. |should_notify_updated_rtt| is true if the SPW
-  // is interested in receiving RTT notifications. |num_messages| is the number
-  // of messages that are written/read by the sockets.
-  // |expect_connection_changed_count| is the expected number of connection
-  // change notifications received by the SPW. |expect_rtt_notification_count|
-  // is the expected number of RTT notifications received by the SPW.
-  // This test works by writing |num_messages| to the socket. A different
-  // socket (with a SPW attached to it) reads the messages.
-  void TestSPWNotifications(const base::TimeDelta& advance_ticks,
-                            bool should_notify_updated_rtt,
+  // correctly. |should_notify_updated_rtt| is true if the SPW is interested in
+  // receiving RTT notifications. |num_messages| is the number of messages that
+  // are written/read by the sockets. |expect_connection_changed_count| is the
+  // expected number of connection change notifications received by the SPW.
+  // |expect_rtt_notification_count| is the expected number of RTT
+  // notifications received by the SPW. This test works by writing
+  // |num_messages| to the socket. A different socket (with a SPW attached to
+  // it) reads the messages.
+  void TestSPWNotifications(bool should_notify_updated_rtt,
                             size_t num_messages,
                             size_t expect_connection_changed_count,
                             size_t expect_rtt_notification_count) {
     ASSERT_NO_FATAL_FAILURE(SetUpListenIPv4());
 
-    std::unique_ptr<base::SimpleTestTickClock> tick_clock(
-        new base::SimpleTestTickClock());
-    base::SimpleTestTickClock* tick_clock_ptr = tick_clock.get();
-    tick_clock_ptr->SetNowTicks(base::TimeTicks::Now());
-
     TestCompletionCallback connect_callback;
 
     std::unique_ptr<TestSocketPerformanceWatcher> watcher(
@@ -144,7 +136,6 @@
     TestSocketPerformanceWatcher* watcher_ptr = watcher.get();
 
     TCPSocket connecting_socket(std::move(watcher), NULL, NetLogSource());
-    connecting_socket.SetTickClockForTesting(std::move(tick_clock));
 
     int result = connecting_socket.Open(ADDRESS_FAMILY_IPV4);
     ASSERT_THAT(result, IsOk());
@@ -165,8 +156,6 @@
     ASSERT_THAT(connect_callback.WaitForResult(), IsOk());
 
     for (size_t i = 0; i < num_messages; ++i) {
-      tick_clock_ptr->Advance(advance_ticks);
-
       // Use a 1 byte message so that the watcher is notified at most once per
       // message.
       const std::string message("t");
@@ -396,22 +385,13 @@
 // If SocketPerformanceWatcher::ShouldNotifyUpdatedRTT always returns false,
 // then the wtatcher should not receive any notifications.
 TEST_F(TCPSocketTest, SPWNotInterested) {
-  TestSPWNotifications(base::TimeDelta::FromSeconds(0), false, 2u, 0u, 0u);
-}
-
-// One notification should be received when the socket connects. No additional
-// notifications should be received when the message is read because the clock
-// is not advanced.
-TEST_F(TCPSocketTest, SPWNoAdvance) {
-  TestSPWNotifications(base::TimeDelta::FromSeconds(0), true, 2u, 0u, 1u);
+  TestSPWNotifications(false, 2u, 0u, 0u);
 }
 
 // One notification should be received when the socket connects. One
-// additional notification should be received for each message read since this
-// test advances clock by 2 seconds (which is longer than the minimum interval
-// between consecutive notifications) before every read.
-TEST_F(TCPSocketTest, SPWAdvance) {
-  TestSPWNotifications(base::TimeDelta::FromSeconds(2), true, 2u, 0u, 3u);
+// additional notification should be received for each message read.
+TEST_F(TCPSocketTest, SPWNoAdvance) {
+  TestSPWNotifications(true, 2u, 0u, 3u);
 }
 #endif  // defined(TCP_INFO) || defined(OS_LINUX)
 
diff --git a/net/url_request/url_request_data_job_fuzzer.cc b/net/url_request/url_request_data_job_fuzzer.cc
index 003edd5c..82b6047 100644
--- a/net/url_request/url_request_data_job_fuzzer.cc
+++ b/net/url_request/url_request_data_job_fuzzer.cc
@@ -7,8 +7,10 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/memory/singleton.h"
+#include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/test/fuzzed_data_provider.h"
+#include "base/test/scoped_task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/http/http_request_headers.h"
 #include "net/url_request/data_protocol_handler.h"
@@ -29,7 +31,9 @@
 class URLRequestDataJobFuzzerHarness : public net::URLRequest::Delegate {
  public:
   URLRequestDataJobFuzzerHarness()
-      : context_(true), task_runner_(base::ThreadTaskRunnerHandle::Get()) {
+      : scoped_task_scheduler_(base::MessageLoop::current()),
+        task_runner_(base::ThreadTaskRunnerHandle::Get()),
+        context_(true) {
     job_factory_.SetProtocolHandler(
         "data", base::MakeUnique<net::DataProtocolHandler>());
     context_.set_job_factory(&job_factory_);
@@ -155,11 +159,13 @@
  private:
   friend struct base::DefaultSingletonTraits<URLRequestDataJobFuzzerHarness>;
 
+  base::test::ScopedTaskScheduler scoped_task_scheduler_;
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+
   net::TestURLRequestContext context_;
   net::URLRequestJobFactoryImpl job_factory_;
   std::vector<size_t> read_lengths_;
   scoped_refptr<net::IOBuffer> buf_;
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   base::RunLoop* read_loop_;
 
   DISALLOW_COPY_AND_ASSIGN(URLRequestDataJobFuzzerHarness);
diff --git a/services/ui/demo/BUILD.gn b/services/ui/demo/BUILD.gn
index 5ff9b13..f49992d 100644
--- a/services/ui/demo/BUILD.gn
+++ b/services/ui/demo/BUILD.gn
@@ -12,6 +12,8 @@
   sources = [
     "mus_demo.cc",
     "mus_demo.h",
+    "window_tree_data.cc",
+    "window_tree_data.h",
   ]
 
   public_deps = [
diff --git a/services/ui/demo/mus_demo.cc b/services/ui/demo/mus_demo.cc
index cf79749..e529794 100644
--- a/services/ui/demo/mus_demo.cc
+++ b/services/ui/demo/mus_demo.cc
@@ -5,25 +5,17 @@
 #include "services/ui/demo/mus_demo.h"
 
 #include "base/memory/ptr_util.h"
-#include "base/time/time.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "services/service_manager/public/cpp/service_context.h"
+#include "services/ui/demo/window_tree_data.h"
 #include "services/ui/public/cpp/gpu/gpu.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "third_party/skia/include/core/SkCanvas.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "third_party/skia/include/core/SkImageInfo.h"
-#include "third_party/skia/include/core/SkPaint.h"
-#include "third_party/skia/include/core/SkRect.h"
 #include "ui/aura/client/default_capture_client.h"
 #include "ui/aura/env.h"
 #include "ui/aura/mus/property_converter.h"
 #include "ui/aura/mus/window_tree_client.h"
 #include "ui/aura/mus/window_tree_host_mus.h"
 #include "ui/aura/window.h"
-#include "ui/aura_extra/image_window_delegate.h"
 #include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/image/image.h"
 #include "ui/wm/core/wm_state.h"
 
 namespace ui {
@@ -31,105 +23,9 @@
 
 namespace {
 
-// Milliseconds between frames.
-const int64_t kFrameDelay = 33;
-
 // Size of square in pixels to draw.
 const int kSquareSize = 300;
 
-const SkColor kBgColor = SK_ColorRED;
-const SkColor kFgColor = SK_ColorYELLOW;
-
-void DrawSquare(const gfx::Rect& bounds,
-                double angle,
-                SkCanvas* canvas,
-                int size) {
-  // Create SkRect to draw centered inside the bounds.
-  gfx::Point top_left = bounds.CenterPoint();
-  top_left.Offset(-size / 2, -size / 2);
-  SkRect rect = SkRect::MakeXYWH(top_left.x(), top_left.y(), size, size);
-
-  // Set SkPaint to fill solid color.
-  SkPaint paint;
-  paint.setStyle(SkPaint::kFill_Style);
-  paint.setColor(kFgColor);
-
-  // Rotate the canvas.
-  const gfx::Size canvas_size = bounds.size();
-  if (angle != 0.0) {
-    canvas->translate(SkFloatToScalar(canvas_size.width() * 0.5f),
-                      SkFloatToScalar(canvas_size.height() * 0.5f));
-    canvas->rotate(angle);
-    canvas->translate(-SkFloatToScalar(canvas_size.width() * 0.5f),
-                      -SkFloatToScalar(canvas_size.height() * 0.5f));
-  }
-
-  canvas->drawRect(rect, paint);
-}
-
-}  // namespace
-
-class MusDemo::WindowTreeData {
- public:
-  explicit WindowTreeData(
-      std::unique_ptr<aura::WindowTreeHostMus> window_tree_host,
-      int square_size)
-      : square_size_(square_size) {
-    Init(std::move(window_tree_host));
-  }
-
- private:
-  // Initializes the window tree host and start drawing frames.
-  void Init(std::unique_ptr<aura::WindowTreeHostMus> window_tree_host);
-
-  // Draws one frame, incrementing the rotation angle.
-  void DrawFrame();
-
-  // Helper function to retrieve the window to which we draw the bitmap.
-  aura::Window* bitmap_window() {
-    DCHECK(!window_tree_host_->window()->children().empty());
-    return window_tree_host_->window()->children()[0];
-  }
-
-  // The Window tree host corresponding to this data.
-  std::unique_ptr<aura::WindowTreeHostMus> window_tree_host_;
-
-  // Destroys itself when the window gets destroyed.
-  aura_extra::ImageWindowDelegate* window_delegate_ = nullptr;
-
-  // Timer for calling DrawFrame().
-  base::RepeatingTimer timer_;
-
-  // Current rotation angle for drawing.
-  double angle_ = 0.0;
-
-  // Size in pixels of the square to draw.
-  const int square_size_;
-
-  DISALLOW_COPY_AND_ASSIGN(WindowTreeData);
-};
-
-void MusDemo::WindowTreeData::Init(
-    std::unique_ptr<aura::WindowTreeHostMus> window_tree_host) {
-  window_tree_host->InitHost();
-  window_tree_host->Show();
-  // Take ownership of the WTH.
-  window_tree_host_ = std::move(window_tree_host);
-
-  // Initialize the window for the bitmap.
-  window_delegate_ = new aura_extra::ImageWindowDelegate();
-  aura::Window* root_window = window_tree_host_->window();
-  aura::Window* bitmap_window = new aura::Window(window_delegate_);
-  bitmap_window->Init(LAYER_TEXTURED);
-  bitmap_window->SetBounds(gfx::Rect(root_window->bounds().size()));
-  bitmap_window->Show();
-  bitmap_window->SetName("Bitmap");
-  root_window->AddChild(bitmap_window);
-
-  // Draw initial frame and start the timer to regularly draw frames.
-  DrawFrame();
-  timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kFrameDelay),
-               base::Bind(&WindowTreeData::DrawFrame, base::Unretained(this)));
 }
 
 MusDemo::MusDemo() {}
@@ -151,6 +47,8 @@
       context()->connector(), this, this);
   window_tree_client_->ConnectAsWindowManager();
 
+  window_tree_data_ = base::MakeUnique<WindowTreeData>(kSquareSize);
+
   env_->SetWindowTreeClient(window_tree_client_.get());
 }
 
@@ -221,9 +119,8 @@
 void MusDemo::OnWmNewDisplay(
     std::unique_ptr<aura::WindowTreeHostMus> window_tree_host,
     const display::Display& display) {
-  DCHECK(!window_tree_data_);  // Only support one display.
-  window_tree_data_ = base::MakeUnique<WindowTreeData>(
-      std::move(window_tree_host), kSquareSize);
+  DCHECK(!window_tree_data_->IsInitialized());  // Only support one display.
+  window_tree_data_->Init(std::move(window_tree_host));
 }
 
 void MusDemo::OnWmDisplayRemoved(aura::WindowTreeHostMus* window_tree_host) {
@@ -254,33 +151,5 @@
 
 void MusDemo::OnWmDeactivateWindow(aura::Window* window) {}
 
-void MusDemo::WindowTreeData::DrawFrame() {
-  angle_ += 2.0;
-  if (angle_ >= 360.0)
-    angle_ = 0.0;
-
-  const gfx::Rect& bounds = bitmap_window()->bounds();
-
-  // Allocate a bitmap of correct size.
-  SkBitmap bitmap;
-  SkImageInfo image_info = SkImageInfo::MakeN32(bounds.width(), bounds.height(),
-                                                kPremul_SkAlphaType);
-  bitmap.allocPixels(image_info);
-
-  // Draw the rotated square on background in bitmap.
-  SkCanvas canvas(bitmap);
-  canvas.clear(kBgColor);
-  // TODO(kylechar): Add GL drawing instead of software rasterization in future.
-  DrawSquare(bounds, angle_, &canvas, square_size_);
-  canvas.flush();
-
-  gfx::ImageSkiaRep image_skia_rep(bitmap, 1);
-  gfx::ImageSkia image_skia(image_skia_rep);
-  gfx::Image image(image_skia);
-
-  window_delegate_->SetImage(image);
-  bitmap_window()->SchedulePaintInRect(gfx::Rect(bounds.size()));
-}
-
 }  // namespace demo
 }  // namespace aura
diff --git a/services/ui/demo/mus_demo.h b/services/ui/demo/mus_demo.h
index 55112da..58bb6f5 100644
--- a/services/ui/demo/mus_demo.h
+++ b/services/ui/demo/mus_demo.h
@@ -35,6 +35,8 @@
 namespace ui {
 namespace demo {
 
+class WindowTreeData;
+
 // A simple MUS Demo service. This service connects to the service:ui, adds a
 // new window to the root Window, and draws a spinning square in the center of
 // the window. Provides a simple way to demonstrate that the graphic stack works
@@ -102,7 +104,6 @@
   std::unique_ptr<::wm::WMState> wm_state_;
   std::unique_ptr<aura::PropertyConverter> property_converter_;
 
-  class WindowTreeData;
   std::unique_ptr<WindowTreeData> window_tree_data_;
 
   DISALLOW_COPY_AND_ASSIGN(MusDemo);
diff --git a/services/ui/demo/window_tree_data.cc b/services/ui/demo/window_tree_data.cc
new file mode 100644
index 0000000..3d78c94
--- /dev/null
+++ b/services/ui/demo/window_tree_data.cc
@@ -0,0 +1,121 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/ui/demo/window_tree_data.h"
+
+#include "base/time/time.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkCanvas.h"
+#include "third_party/skia/include/core/SkColor.h"
+#include "third_party/skia/include/core/SkImageInfo.h"
+#include "third_party/skia/include/core/SkPaint.h"
+#include "third_party/skia/include/core/SkRect.h"
+#include "ui/aura/mus/window_tree_host_mus.h"
+#include "ui/aura/window.h"
+#include "ui/aura_extra/image_window_delegate.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/image/image.h"
+
+namespace ui {
+namespace demo {
+
+namespace {
+
+// Milliseconds between frames.
+const int64_t kFrameDelay = 33;
+
+const SkColor kBgColor = SK_ColorRED;
+const SkColor kFgColor = SK_ColorYELLOW;
+
+void DrawSquare(const gfx::Rect& bounds,
+                double angle,
+                SkCanvas* canvas,
+                int size) {
+  // Create SkRect to draw centered inside the bounds.
+  gfx::Point top_left = bounds.CenterPoint();
+  top_left.Offset(-size / 2, -size / 2);
+  SkRect rect = SkRect::MakeXYWH(top_left.x(), top_left.y(), size, size);
+
+  // Set SkPaint to fill solid color.
+  SkPaint paint;
+  paint.setStyle(SkPaint::kFill_Style);
+  paint.setColor(kFgColor);
+
+  // Rotate the canvas.
+  const gfx::Size canvas_size = bounds.size();
+  if (angle != 0.0) {
+    canvas->translate(SkFloatToScalar(canvas_size.width() * 0.5f),
+                      SkFloatToScalar(canvas_size.height() * 0.5f));
+    canvas->rotate(angle);
+    canvas->translate(-SkFloatToScalar(canvas_size.width() * 0.5f),
+                      -SkFloatToScalar(canvas_size.height() * 0.5f));
+  }
+
+  canvas->drawRect(rect, paint);
+}
+
+}  // namespace
+
+WindowTreeData::WindowTreeData(int square_size) : square_size_(square_size) {}
+
+WindowTreeData::~WindowTreeData() {}
+
+aura::Window* WindowTreeData::bitmap_window() {
+  DCHECK(!window_tree_host_->window()->children().empty());
+  return window_tree_host_->window()->children()[0];
+}
+
+void WindowTreeData::Init(
+    std::unique_ptr<aura::WindowTreeHostMus> window_tree_host) {
+  window_tree_host->InitHost();
+  window_tree_host->Show();
+  // Take ownership of the WTH.
+  window_tree_host_ = std::move(window_tree_host);
+
+  // Initialize the window for the bitmap.
+  window_delegate_ = new aura_extra::ImageWindowDelegate();
+  aura::Window* root_window = window_tree_host_->window();
+  aura::Window* bitmap_window = new aura::Window(window_delegate_);
+  bitmap_window->Init(LAYER_TEXTURED);
+  bitmap_window->SetBounds(gfx::Rect(root_window->bounds().size()));
+  bitmap_window->Show();
+  bitmap_window->SetName("Bitmap");
+  root_window->AddChild(bitmap_window);
+
+  // Draw initial frame and start the timer to regularly draw frames.
+  DrawFrame();
+  timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(kFrameDelay),
+               base::Bind(&WindowTreeData::DrawFrame, base::Unretained(this)));
+}
+
+void WindowTreeData::DrawFrame() {
+  angle_ += 2.0;
+  if (angle_ >= 360.0)
+    angle_ = 0.0;
+
+  const gfx::Rect& bounds = bitmap_window()->bounds();
+
+  // Allocate a bitmap of correct size.
+  SkBitmap bitmap;
+  SkImageInfo image_info = SkImageInfo::MakeN32(bounds.width(), bounds.height(),
+                                                kPremul_SkAlphaType);
+  bitmap.allocPixels(image_info);
+
+  // Draw the rotated square on background in bitmap.
+  SkCanvas canvas(bitmap);
+  canvas.clear(kBgColor);
+  // TODO(kylechar): Add GL drawing instead of software rasterization in future.
+  DrawSquare(bounds, angle_, &canvas, square_size_);
+  canvas.flush();
+
+  gfx::ImageSkiaRep image_skia_rep(bitmap, 1);
+  gfx::ImageSkia image_skia(image_skia_rep);
+  gfx::Image image(image_skia);
+
+  window_delegate_->SetImage(image);
+  bitmap_window()->SchedulePaintInRect(gfx::Rect(bounds.size()));
+}
+
+}  // namespace demo
+}  // namespace ui
diff --git a/services/ui/demo/window_tree_data.h b/services/ui/demo/window_tree_data.h
new file mode 100644
index 0000000..0e1bcbd
--- /dev/null
+++ b/services/ui/demo/window_tree_data.h
@@ -0,0 +1,60 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_UI_DEMO_WINDOW_TREE_DATA_H_
+#define SERVICES_UI_DEMO_WINDOW_TREE_DATA_H_
+
+#include "base/memory/ptr_util.h"
+#include "base/timer/timer.h"
+
+namespace aura {
+class Window;
+class WindowTreeHostMus;
+}  // namespace aura
+
+namespace aura_extra {
+class ImageWindowDelegate;
+}  // namespace aura_extra
+
+namespace ui {
+namespace demo {
+
+class WindowTreeData {
+ public:
+  explicit WindowTreeData(int square_size);
+  ~WindowTreeData();
+
+  // Initializes the window tree host and start drawing frames.
+  void Init(std::unique_ptr<aura::WindowTreeHostMus> window_tree_host);
+  bool IsInitialized() const { return !!window_tree_host_; }
+
+ private:
+  // Draws one frame, incrementing the rotation angle.
+  void DrawFrame();
+
+  // Helper function to retrieve the window to which we draw the bitmap.
+  aura::Window* bitmap_window();
+
+  // The Window tree host corresponding to this data.
+  std::unique_ptr<aura::WindowTreeHostMus> window_tree_host_;
+
+  // Destroys itself when the window gets destroyed.
+  aura_extra::ImageWindowDelegate* window_delegate_ = nullptr;
+
+  // Timer for calling DrawFrame().
+  base::RepeatingTimer timer_;
+
+  // Current rotation angle for drawing.
+  double angle_ = 0.0;
+
+  // Size in pixels of the square to draw.
+  const int square_size_;
+
+  DISALLOW_COPY_AND_ASSIGN(WindowTreeData);
+};
+
+}  // namespace demo
+}  // namespace ui
+
+#endif  // SERVICES_UI_DEMO_WINDOW_TREE_DATA_H_
diff --git a/services/ui/ws/window_server_service_test_base.cc b/services/ui/ws/window_server_service_test_base.cc
index 12203e4..4289dca 100644
--- a/services/ui/ws/window_server_service_test_base.cc
+++ b/services/ui/ws/window_server_service_test_base.cc
@@ -50,7 +50,7 @@
 WindowServerServiceTestBase::WindowServerServiceTestBase()
     : ServiceTest(kTestAppName) {
   EnsureCommandLineSwitch(switches::kUseTestConfig);
-  EnsureCommandLineSwitch(::switches::kOverrideUseGLWithOSMesaForTests);
+  EnsureCommandLineSwitch(::switches::kOverrideUseSoftwareGLForTests);
 }
 
 WindowServerServiceTestBase::~WindowServerServiceTestBase() {}
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index b8fdecf..60d9d74 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -10341,6 +10341,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6613",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
@@ -10537,6 +10553,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests",
           "--use-angle=d3d9"
         ],
@@ -10754,6 +10786,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": false,
+          "dimension_sets": [
+            {
+              "gpu": "8086:1912",
+              "os": "Windows-10"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -11221,6 +11269,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-10"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -11688,6 +11752,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": false,
+          "dimension_sets": [
+            {
+              "gpu": "8086:1912",
+              "os": "Windows-10"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -12194,6 +12274,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": false,
+          "dimension_sets": [
+            {
+              "gpu": "10de:1430",
+              "os": "Windows-10"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -12700,6 +12796,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-10"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -13209,6 +13321,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6613",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -13653,6 +13781,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -14103,6 +14247,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": false,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6779",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -14624,6 +14784,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6613",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -15110,6 +15286,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": false,
+          "dimension_sets": [
+            {
+              "gpu": "8086:041a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -15593,6 +15785,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": false,
+          "dimension_sets": [
+            {
+              "gpu": "10de:0f02",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -16191,6 +16399,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -16716,6 +16940,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
@@ -17218,6 +17458,22 @@
       },
       {
         "args": [
+          "--test-launcher-retry-limit=0"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "10de:104a",
+              "os": "Windows-2008ServerR2-SP1"
+            }
+          ]
+        },
+        "test": "angle_white_box_tests",
+        "use_xvfb": false
+      },
+      {
+        "args": [
           "--use-gpu-in-tests"
         ],
         "swarming": {
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 67b5b43..e380995b 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -118,6 +118,11 @@
     "type": "raw",
     "args": [],
   },
+  "angle_white_box_tests": {
+    "label": "//third_party/angle/src/tests:angle_white_box_tests",
+    "type": "raw",
+    "args": [],
+  },
   "angle_unittests": {
     "label": "//third_party/angle/src/tests:angle_unittests",
     "type": "raw",
@@ -1024,8 +1029,13 @@
     "args": [
       "--xvfb",
       "../../third_party/WebKit/Tools/Scripts/run-webkit-tests",
-      "--clobber-old-results",
+      "--seed", "4",
       "--no-show-results",
+      "--full-results-html",
+      "--clobber-old-results",
+      "--exit-after-n-failures", "5000",
+      "--exit-after-n-crashes-or-timeouts", "100",
+      "--debug-rwt-logging",
       "--results-directory", "${ISOLATED_OUTDIR}/layout-test-results",
     ],
   },
diff --git a/third_party/WebKit/LayoutTests/editing/assert_selection.html b/third_party/WebKit/LayoutTests/editing/assert_selection.html
index 57ba0ef7..007df49 100644
--- a/third_party/WebKit/LayoutTests/editing/assert_selection.html
+++ b/third_party/WebKit/LayoutTests/editing/assert_selection.html
@@ -165,9 +165,9 @@
     [
         '<div id="host">',
             '<span id="ghi">ghi</span>',
-            '<b id="def">def</b>',
+            '<b id="def">|def</b>',
             '<span id="jkl">jkl</span>',
-            '<b id="abc">^abc|</b>',
+            '<b id="abc">^abc</b>',
             '<span id="mno">mno</span>',
         '</div>',
     ].join(''),
@@ -197,9 +197,9 @@
     [
         '<div id="host">',
             '<span id="ghi">ghi</span>',
-            '<b id="def" slot="def">def</b>',
+            '<b id="def" slot="def">|def</b>',
             '<span id="jkl">jkl</span>',
-            '<b id="abc" slot="abc">^abc|</b>',
+            '<b id="abc" slot="abc">^abc</b>',
             '<span id="mno">mno</span>',
         '</div>',
     ].join(''),
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/crash-indenting-list-item.html b/third_party/WebKit/LayoutTests/editing/execCommand/crash-indenting-list-item.html
index 352b91ed..48cc2a9 100644
--- a/third_party/WebKit/LayoutTests/editing/execCommand/crash-indenting-list-item.html
+++ b/third_party/WebKit/LayoutTests/editing/execCommand/crash-indenting-list-item.html
@@ -6,6 +6,6 @@
     test(() => assert_selection(
         '<div contentEditable><ul><li>|</li></ul></div>',
         'indent',
-        '<div contenteditable><ul><ul><li>|</li></ul></ul></div>'),
+        '<div contenteditable><ul><ul><li></li></ul>|</ul></div>'),
         'This is crash test');
 </script>
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/format-block-multiple-paragraphs-in-pre.html b/third_party/WebKit/LayoutTests/editing/execCommand/format-block-multiple-paragraphs-in-pre.html
index c9f380f..d6647cf 100644
--- a/third_party/WebKit/LayoutTests/editing/execCommand/format-block-multiple-paragraphs-in-pre.html
+++ b/third_party/WebKit/LayoutTests/editing/execCommand/format-block-multiple-paragraphs-in-pre.html
@@ -15,8 +15,8 @@
         [
             '<div contenteditable>',
                 '<h3>',
-                    'hello<br>\nworld<br>\nwebkit|',
-                '</h3>',
+                    'hello<br>\nworld<br>\nwebkit',
+                '</h3>|',
             '</div>',
         ].join('')),
         'formatBlock on all contents with H3');
@@ -51,7 +51,7 @@
         [
             '<div contenteditable>',
                 '<pre>',
-                    'hello\n<h3>\nworld\nwebkit|</h3>',
+                    'hello\n<h3>\nworld\nwebkit</h3>|',
                 '</pre>',
             '</div>',
         ].join('')),
diff --git a/third_party/WebKit/LayoutTests/editing/execCommand/format-block-multiple-paragraphs.html b/third_party/WebKit/LayoutTests/editing/execCommand/format-block-multiple-paragraphs.html
index 761140c0..2d23c24f 100644
--- a/third_party/WebKit/LayoutTests/editing/execCommand/format-block-multiple-paragraphs.html
+++ b/third_party/WebKit/LayoutTests/editing/execCommand/format-block-multiple-paragraphs.html
@@ -25,7 +25,7 @@
   'formatBlock blockquote',
   [
     '<div contenteditable>',
-      '<blockquote>hello<br>world|</blockquote>',
+      '^<blockquote>hello<br>world</blockquote>|',
     '</div>',
   ].join('')), '1 select all children BLOCKQUOTE');
 
@@ -51,7 +51,7 @@
   'formatBlock blockquote',
   [
     '<div contenteditable>',
-      '<blockquote>hello<br>world<br>Blink|</blockquote>',
+      '^<blockquote>hello<br>world<br>Blink</blockquote>|',
     '</div>',
   ].join('')), '3 select all children PRE');
 
diff --git a/third_party/WebKit/LayoutTests/editing/selection/character-data-mutation.html b/third_party/WebKit/LayoutTests/editing/selection/character-data-mutation.html
index 9d64958..02f0f0a 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/character-data-mutation.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/character-data-mutation.html
@@ -17,7 +17,7 @@
 test_selection(
     '<div contenteditable><span>he^llo</span> wo|rld</div>',
     selection => selection.document.querySelector('span').remove(),
-    '<div contenteditable> ^wo|rld</div>',
+    '<div contenteditable>^ wo|rld</div>',
     'Remove the parent of startContainer');
 
 // set nodeValue
@@ -30,7 +30,7 @@
 test_selection(
     '<div contenteditable><span>he^llo</span> wo|rld</div>',
     selection => selection.document.querySelector('div').lastChild.nodeValue = 'a',
-    '<div contenteditable><span>he^llo|</span>a</div>',
+    '<div contenteditable><span>he^llo</span>|a</div>',
     'Replace nodeValue of endContainer');
 
 // appendData
@@ -75,7 +75,7 @@
 test_selection(
     '<div contenteditable><span>he^llo</span> wo|rld</div>',
     selection => selection.document.querySelector('span').firstChild.deleteData(1, 4),
-    '<div contenteditable><span>h</span>^ wo|rld</div>',
+    '<div contenteditable><span>h^</span> wo|rld</div>',
     'deleteData(1, 4) in startContainer');
 
 test_selection(
@@ -93,7 +93,7 @@
 test_selection(
     '<div contenteditable><span>he^llo</span> wo|rld</div>',
     selection => selection.document.querySelector('div').lastChild.deleteData(0, 3),
-    '<div contenteditable><span>he^llo|</span>rld</div>',
+    '<div contenteditable><span>he^llo</span>|rld</div>',
     'deleteData(0, 3) in endContainer');
 
 test_selection(
diff --git a/third_party/WebKit/LayoutTests/editing/selection/document-mutation.html b/third_party/WebKit/LayoutTests/editing/selection/document-mutation.html
index cc091453..6587ad2 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/document-mutation.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/document-mutation.html
@@ -61,7 +61,7 @@
 test_selection(
     '<p>Abcd efgh T^he Range i|jkl</p>',
     selection => doDelete(selection, 5, 8),
-    '<p>Abcd  ^Range i|jkl</p>',
+    '<p>Abcd ^ Range i|jkl</p>',
     'deleteData(5, 8)');
 
 test_selection(
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/selection/extend-00-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/extend-00-expected.txt
similarity index 65%
rename from third_party/WebKit/LayoutTests/platform/win/external/wpt/selection/extend-00-expected.txt
rename to third_party/WebKit/LayoutTests/external/wpt/selection/extend-00-expected.txt
index ce26833..e4d0147 100644
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/selection/extend-00-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/extend-00-expected.txt
@@ -263,7 +263,7 @@
 CONSOLE ERROR: line 944: The given range isn't in document.
 CONSOLE ERROR: line 944: The given range isn't in document.
 This is a testharness.js-based test.
-Found 2992 tests; 404 PASS, 2588 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 2992 tests; 1192 PASS, 1800 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS extend() with range 0 [] and point 0 [paras[0].firstChild, -1] 
 PASS extend() with range 0 [] and point 1 [paras[0].firstChild, 0] 
 PASS extend() with range 0 [] and point 2 [paras[0].firstChild, 1] 
@@ -354,23 +354,18 @@
 PASS extend() with range 0 [] and point 87 [xmlDoctype, 0] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 0 [paras[0].firstChild, -1] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 1 [paras[0].firstChild, 0] 
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 2 [paras[0].firstChild, 1] assert_equals: focusOffset must be the offset passed to extend() expected 1 but got 2
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 2 [paras[0].firstChild, 1] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 3 [paras[0].firstChild, 2] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 4 [paras[0].firstChild, 8] 
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 5 [paras[0].firstChild, 9] assert_equals: focusOffset must be the offset passed to extend() expected 9 but got 10
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 5 [paras[0].firstChild, 9] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 6 [paras[0].firstChild, 10] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 9 [paras[1].firstChild, 0] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 10 [paras[1].firstChild, 1] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 11 [paras[1].firstChild, 2] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 12 [paras[1].firstChild, 8] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 13 [paras[1].firstChild, 9] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 9 [paras[1].firstChild, 0] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 10 [paras[1].firstChild, 1] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 11 [paras[1].firstChild, 2] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 12 [paras[1].firstChild, 8] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 13 [paras[1].firstChild, 9] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 14 [paras[1].firstChild, 10] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -388,20 +383,12 @@
 "
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 24 [document.documentElement, -1] 
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 25 [document.documentElement, 0] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 26 [document.documentElement, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 27 [document.documentElement, 2] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Qrstuvwx"
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 25 [document.documentElement, 0] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 26 [document.documentElement, 1] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 27 [document.documentElement, 2] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 28 [document.documentElement, 7] 
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 29 [document.head, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 30 [document.body, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Qrstuvwx"
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 29 [document.head, 1] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 30 [document.body, 3] 
 FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -410,37 +397,26 @@
 "
 FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 35 [paras[0], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 36 [paras[0], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 35 [paras[0], 0] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 36 [paras[0], 1] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 37 [paras[0], 2] 
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 38 [paras[1], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 39 [paras[1], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 38 [paras[1], 0] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 39 [paras[1], 1] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 40 [paras[1], 2] 
 FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 43 [testDiv, 0] assert_equals: focusNode must be the node passed to extend() 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 extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 44 [testDiv, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 43 [testDiv, 0] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 44 [testDiv, 3] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 45 [document, -1] 
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 46 [document, 0] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 47 [document, 1] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 48 [document, 2] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Qrstuvwx"
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 46 [document, 0] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 47 [document, 1] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 48 [document, 2] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 49 [document, 3] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 50 [comment, -1] 
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 51 [comment, 0] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 52 [comment, 4] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 51 [comment, 0] 
+PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 52 [comment, 4] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 53 [comment, 96] 
 FAIL extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
@@ -506,284 +482,291 @@
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 86 [foreignDoctype, 0] 
 PASS extend() with range 1 [paras[0].firstChild, 0, paras[0].firstChild, 0] and point 87 [xmlDoctype, 0] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 0 [paras[0].firstChild, -1] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 1 [paras[0].firstChild, 0] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 1 [paras[0].firstChild, 0] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 2 [paras[0].firstChild, 1] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 2 [paras[0].firstChild, 1] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 3 [paras[0].firstChild, 2] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 3 [paras[0].firstChild, 2] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 4 [paras[0].firstChild, 8] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 5 [paras[0].firstChild, 9] assert_equals: focusOffset must be the offset passed to extend() expected 9 but got 10
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 5 [paras[0].firstChild, 9] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 6 [paras[0].firstChild, 10] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 9 [paras[1].firstChild, 0] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 10 [paras[1].firstChild, 1] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 11 [paras[1].firstChild, 2] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 12 [paras[1].firstChild, 8] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 13 [paras[1].firstChild, 9] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 25 [document.documentElement, 0] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 26 [document.documentElement, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 27 [document.documentElement, 2] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 29 [document.head, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 29 [document.head, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 30 [document.body, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 30 [document.body, 3] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 29 [document.head, 1] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 29 [document.head, 1] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 30 [document.body, 3] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 35 [paras[0], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 36 [paras[0], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 38 [paras[1], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 39 [paras[1], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 43 [testDiv, 0] assert_equals: focusNode must be the node passed to extend() 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 extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 44 [testDiv, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 45 [document, -1] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 45 [document, -1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 46 [document, 0] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 46 [document, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 47 [document, 1] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 47 [document, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 48 [document, 2] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 48 [document, 2] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 45 [document, -1] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 46 [document, 0] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 46 [document, 0] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 47 [document, 1] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 47 [document, 1] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 48 [document, 2] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 48 [document, 2] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 49 [document, 3] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 49 [document, 3] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 49 [document, 3] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 50 [comment, -1] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 50 [comment, -1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 51 [comment, 0] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 51 [comment, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
-FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 52 [comment, 4] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 52 [comment, 4] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 50 [comment, -1] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 51 [comment, 0] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 51 [comment, 0] 
+PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 52 [comment, 4] 
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 52 [comment, 4] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 53 [comment, 96] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 53 [comment, 96] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 53 [comment, 96] 
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 83 [doctype, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 84 [doctype, -17] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 85 [doctype, 1] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 85 [doctype, 1] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: endOffset must be correct expected 1 but got 2
+PASS extend() backwards with range 2 [paras[0].firstChild, 0, paras[0].firstChild, 1] and point 87 [xmlDoctype, 0] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 0 [paras[0].firstChild, -1] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 0 [paras[0].firstChild, -1] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 1 [paras[0].firstChild, 0] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 1 [paras[0].firstChild, 0] 
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 2 [paras[0].firstChild, 1] assert_equals: focusOffset must be the offset passed to extend() expected 1 but got 2
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 2 [paras[0].firstChild, 1] assert_equals: focusOffset must be the offset passed to extend() expected 1 but got 2
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 2 [paras[0].firstChild, 1] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 3 [paras[0].firstChild, 2] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 3 [paras[0].firstChild, 2] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 4 [paras[0].firstChild, 8] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 4 [paras[0].firstChild, 8] 
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 5 [paras[0].firstChild, 9] assert_equals: focusOffset must be the offset passed to extend() expected 9 but got 10
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 5 [paras[0].firstChild, 9] assert_equals: focusOffset must be the offset passed to extend() expected 9 but got 10
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 5 [paras[0].firstChild, 9] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 6 [paras[0].firstChild, 10] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 8 [paras[1].firstChild, -1] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 9 [paras[1].firstChild, 0] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 9 [paras[1].firstChild, 0] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 10 [paras[1].firstChild, 1] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 10 [paras[1].firstChild, 1] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 11 [paras[1].firstChild, 2] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 11 [paras[1].firstChild, 2] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 12 [paras[1].firstChild, 8] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 12 [paras[1].firstChild, 8] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 13 [paras[1].firstChild, 9] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 13 [paras[1].firstChild, 9] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 14 [paras[1].firstChild, 10] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 15 [paras[1].firstChild, 65535] 
@@ -818,34 +801,18 @@
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 24 [document.documentElement, -1] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 24 [document.documentElement, -1] 
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 25 [document.documentElement, 0] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 25 [document.documentElement, 0] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 26 [document.documentElement, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 26 [document.documentElement, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 27 [document.documentElement, 2] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 27 [document.documentElement, 2] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Qrstuvwx"
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 28 [document.documentElement, 7] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 28 [document.documentElement, 7] 
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 29 [document.head, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 29 [document.head, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 30 [document.body, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 30 [document.body, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Qrstuvwx"
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 29 [document.head, 1] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 29 [document.head, 1] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 30 [document.body, 3] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
 FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -862,28 +829,16 @@
 "
 FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 35 [paras[0], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 35 [paras[0], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 36 [paras[0], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 36 [paras[0], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 37 [paras[0], 2] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 37 [paras[0], 2] 
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 38 [paras[1], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 38 [paras[1], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 39 [paras[1], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 39 [paras[1], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 40 [paras[1], 2] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -894,36 +849,26 @@
 "
 FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 43 [testDiv, 0] assert_equals: focusNode must be the node passed to extend() 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 extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 43 [testDiv, 0] assert_equals: focusNode must be the node passed to extend() 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 extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 44 [testDiv, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 44 [testDiv, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 45 [document, -1] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 45 [document, -1] 
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 46 [document, 0] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 46 [document, 0] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 47 [document, 1] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 47 [document, 1] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 48 [document, 2] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 48 [document, 2] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Qrstuvwx"
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 46 [document, 0] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 46 [document, 0] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 47 [document, 1] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 47 [document, 1] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 48 [document, 2] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 48 [document, 2] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 49 [document, 3] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 49 [document, 3] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 50 [comment, -1] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 50 [comment, -1] 
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 51 [comment, 0] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 51 [comment, 0] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 52 [comment, 4] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 52 [comment, 4] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 51 [comment, 0] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 51 [comment, 0] 
+PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 52 [comment, 4] 
+PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 52 [comment, 4] 
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 53 [comment, 96] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 53 [comment, 96] 
 FAIL extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
@@ -1053,271 +998,277 @@
 PASS extend() forwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 87 [xmlDoctype, 0] 
 PASS extend() backwards with range 3 [paras[0].firstChild, 2, paras[0].firstChild, 8] and point 87 [xmlDoctype, 0] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 0 [paras[0].firstChild, -1] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 1 [paras[0].firstChild, 0] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 2 [paras[0].firstChild, 1] assert_equals: focusOffset must be the offset passed to extend() expected 1 but got 2
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 2 [paras[0].firstChild, 1] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 3 [paras[0].firstChild, 2] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 3 [paras[0].firstChild, 2] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 4 [paras[0].firstChild, 8] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 4 [paras[0].firstChild, 8] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 5 [paras[0].firstChild, 9] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 5 [paras[0].firstChild, 9] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 6 [paras[0].firstChild, 10] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 9 [paras[1].firstChild, 0] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 10 [paras[1].firstChild, 1] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 11 [paras[1].firstChild, 2] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 12 [paras[1].firstChild, 8] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 13 [paras[1].firstChild, 9] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 24 [document.documentElement, -1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 25 [document.documentElement, 0] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 25 [document.documentElement, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 26 [document.documentElement, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 26 [document.documentElement, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 27 [document.documentElement, 2] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 27 [document.documentElement, 2] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 28 [document.documentElement, 7] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 29 [document.head, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 29 [document.head, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 30 [document.body, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 30 [document.body, 3] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 29 [document.head, 1] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 29 [document.head, 1] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 30 [document.body, 3] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 35 [paras[0], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 35 [paras[0], 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 36 [paras[0], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 36 [paras[0], 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 37 [paras[0], 2] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 38 [paras[1], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 38 [paras[1], 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 39 [paras[1], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 39 [paras[1], 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 40 [paras[1], 2] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 41 [detachedPara1, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 42 [detachedPara1, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 43 [testDiv, 0] assert_equals: focusNode must be the node passed to extend() 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 extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 43 [testDiv, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 44 [testDiv, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 44 [testDiv, 3] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 45 [document, -1] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 45 [document, -1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 46 [document, 0] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 46 [document, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 47 [document, 1] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 47 [document, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 48 [document, 2] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 48 [document, 2] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 45 [document, -1] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 46 [document, 0] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 46 [document, 0] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 47 [document, 1] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 47 [document, 1] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 48 [document, 2] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 48 [document, 2] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 49 [document, 3] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 49 [document, 3] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 49 [document, 3] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 50 [comment, -1] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 50 [comment, -1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 51 [comment, 0] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 51 [comment, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
-FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 52 [comment, 4] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 52 [comment, 4] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 50 [comment, -1] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 51 [comment, 0] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 51 [comment, 0] 
+PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 52 [comment, 4] 
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 52 [comment, 4] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 53 [comment, 96] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 53 [comment, 96] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 53 [comment, 96] 
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 54 [foreignDoc, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 55 [foreignDoc, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 56 [foreignComment, 2] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 59 [xmlDoc, -1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 60 [xmlDoc, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 61 [xmlDoc, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 62 [xmlDoc, 5] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 63 [xmlComment, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 64 [xmlComment, 4] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 65 [processingInstruction, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 66 [processingInstruction, 5] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 67 [processingInstruction, 9] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 75 [detachedComment, 3] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 76 [detachedComment, 5] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 80 [docfrag, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
 "
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 83 [doctype, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 84 [doctype, -17] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 85 [doctype, 1] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 85 [doctype, 1] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: endOffset must be correct expected 9 but got 10
+PASS extend() backwards with range 4 [paras[0].firstChild, 2, paras[0].firstChild, 9] and point 87 [xmlDoctype, 0] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 1 [paras[0].firstChild, 0] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 2 [paras[0].firstChild, 1] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 3 [paras[0].firstChild, 2] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 4 [paras[0].firstChild, 8] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 5 [paras[0].firstChild, 9] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 6 [paras[0].firstChild, 10] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 9 [paras[1].firstChild, 0] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 10 [paras[1].firstChild, 1] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 11 [paras[1].firstChild, 2] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 12 [paras[1].firstChild, 8] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 13 [paras[1].firstChild, 9] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 14 [paras[1].firstChild, 10] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
@@ -1335,17 +1286,12 @@
 "
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 24 [document.documentElement, -1] 
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 25 [document.documentElement, 0] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 26 [document.documentElement, 1] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 27 [document.documentElement, 2] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 28 [document.documentElement, 7] 
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 29 [document.head, 1] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 30 [document.body, 3] 
 FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
 "
 FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
@@ -1354,37 +1300,26 @@
 "
 FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
 "
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 35 [paras[0], 0] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 36 [paras[0], 1] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 37 [paras[0], 2] 
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 38 [paras[1], 0] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 39 [paras[1], 1] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 40 [paras[1], 2] 
 FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
 "
 FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
 "
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 43 [testDiv, 0] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 44 [testDiv, 3] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 45 [document, -1] 
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 46 [document, 0] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 47 [document, 1] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 48 [document, 2] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 49 [document, 3] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 50 [comment, -1] 
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 51 [comment, 0] 
+PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 52 [comment, 4] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 53 [comment, 96] 
 FAIL extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
 "
@@ -1450,1001 +1385,779 @@
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 86 [foreignDoctype, 0] 
 PASS extend() with range 5 [paras[1].firstChild, 0, paras[1].firstChild, 0] and point 87 [xmlDoctype, 0] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 29 [document.head, 1] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 29 [document.head, 1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 30 [document.body, 3] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 45 [document, -1] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 45 [document, -1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 46 [document, 0] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 46 [document, 0] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 47 [document, 1] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 47 [document, 1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 48 [document, 2] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 48 [document, 2] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 49 [document, 3] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 49 [document, 3] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 50 [comment, -1] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 50 [comment, -1] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 51 [comment, 0] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 51 [comment, 0] 
+PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 52 [comment, 4] 
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 52 [comment, 4] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 53 [comment, 96] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 53 [comment, 96] 
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 85 [doctype, 1] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 6 [paras[1].firstChild, 0, paras[1].firstChild, 1] and point 87 [xmlDoctype, 0] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 29 [document.head, 1] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 29 [document.head, 1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 30 [document.body, 3] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 45 [document, -1] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 45 [document, -1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 46 [document, 0] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 46 [document, 0] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 47 [document, 1] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 47 [document, 1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 48 [document, 2] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 48 [document, 2] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 49 [document, 3] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 49 [document, 3] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 50 [comment, -1] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 50 [comment, -1] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 51 [comment, 0] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 51 [comment, 0] 
+PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 52 [comment, 4] 
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 52 [comment, 4] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 53 [comment, 96] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 53 [comment, 96] 
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 85 [doctype, 1] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 7 [paras[1].firstChild, 2, paras[1].firstChild, 8] and point 87 [xmlDoctype, 0] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 29 [document.head, 1] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 29 [document.head, 1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 30 [document.body, 3] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 45 [document, -1] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 45 [document, -1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 46 [document, 0] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 46 [document, 0] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 47 [document, 1] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 47 [document, 1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 48 [document, 2] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 48 [document, 2] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 49 [document, 3] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 49 [document, 3] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 50 [comment, -1] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 50 [comment, -1] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 51 [comment, 0] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 51 [comment, 0] 
+PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 52 [comment, 4] 
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 52 [comment, 4] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 53 [comment, 96] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 53 [comment, 96] 
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
 "
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 85 [doctype, 1] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
+PASS extend() backwards with range 8 [paras[1].firstChild, 2, paras[1].firstChild, 9] and point 87 [xmlDoctype, 0] 
 FAIL extend() with range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
 FAIL extend() with range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
 FAIL extend() with range 9 [detachedPara1.firstChild, 0, detachedPara1.firstChild, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
@@ -3326,1382 +3039,793 @@
 FAIL extend() forwards with range 14 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
 FAIL extend() backwards with range 14 [foreignPara1.firstChild, 2, foreignPara1.firstChild, 8] and point 87 [xmlDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 29 [document.head, 1] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 29 [document.head, 1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 30 [document.body, 3] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 45 [document, -1] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 45 [document, -1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 46 [document, 0] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 46 [document, 0] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 47 [document, 1] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 47 [document, 1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 48 [document, 2] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 48 [document, 2] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 49 [document, 3] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 49 [document, 3] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 50 [comment, -1] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 50 [comment, -1] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 51 [comment, 0] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 51 [comment, 0] 
+PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 52 [comment, 4] 
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 52 [comment, 4] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 53 [comment, 96] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 53 [comment, 96] 
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 85 [doctype, 1] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 15 [document.documentElement, 0, document.documentElement, 1] and point 87 [xmlDoctype, 0] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 29 [document.head, 1] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 29 [document.head, 1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 30 [document.body, 3] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 45 [document, -1] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 45 [document, -1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 46 [document, 0] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 46 [document, 0] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 47 [document, 1] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 47 [document, 1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 48 [document, 2] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 48 [document, 2] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 49 [document, 3] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 49 [document, 3] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 50 [comment, -1] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 50 [comment, -1] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 51 [comment, 0] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 51 [comment, 0] 
+PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 52 [comment, 4] 
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 52 [comment, 4] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 53 [comment, 96] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 53 [comment, 96] 
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 85 [doctype, 1] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 16 [document.documentElement, 0, document.documentElement, 2] and point 87 [xmlDoctype, 0] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 29 [document.head, 1] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 29 [document.head, 1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 30 [document.body, 3] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 45 [document, -1] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 45 [document, -1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 46 [document, 0] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 46 [document, 0] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 47 [document, 1] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 47 [document, 1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 48 [document, 2] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 48 [document, 2] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 49 [document, 3] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 49 [document, 3] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 50 [comment, -1] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 50 [comment, -1] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 51 [comment, 0] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 51 [comment, 0] 
+PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 52 [comment, 4] 
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 52 [comment, 4] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 53 [comment, 96] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 53 [comment, 96] 
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
 <meta...
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 85 [doctype, 1] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() backwards with range 17 [document.documentElement, 1, document.documentElement, 2] and point 87 [xmlDoctype, 0] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 6 [paras[0].firstChild, 10] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 13 [paras[1].firstChild, 9] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 14 [paras[1].firstChild, 10] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <head><title>Selection extend() tests</title>
@@ -4719,22 +3843,12 @@
 <meta chars...
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 24 [document.documentElement, -1] 
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 25 [document.documentElement, 0] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 26 [document.documentElement, 1] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 27 [document.documentElement, 2] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 28 [document.documentElement, 7] 
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 29 [document.head, 1] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 30 [document.body, 3] 
 FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <head><title>Selection extend() tests</title>
 <meta chars...
 FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <head><title>Selection extend() tests</title>
@@ -4743,48 +3857,26 @@
 <meta chars...
 FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <head><title>Selection extend() tests</title>
 <meta chars...
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 35 [paras[0], 0] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 36 [paras[0], 1] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 37 [paras[0], 2] 
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 38 [paras[1], 0] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 39 [paras[1], 1] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 40 [paras[1], 2] 
 FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <head><title>Selection extend() tests</title>
 <meta chars...
 FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <head><title>Selection extend() tests</title>
 <meta chars...
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 43 [testDiv, 0] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 44 [testDiv, 3] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 45 [document, -1] 
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 46 [document, 0] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 47 [document, 1] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 48 [document, 2] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 49 [document, 3] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 50 [comment, -1] 
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 51 [comment, 0] 
+PASS extend() with range 18 [document.head, 1, document.head, 1] and point 52 [comment, 4] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 53 [comment, 96] 
 FAIL extend() with range 18 [document.head, 1, document.head, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <head><title>Selection extend() tests</title>
 <meta chars...
@@ -4850,451 +3942,262 @@
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 86 [foreignDoctype, 0] 
 PASS extend() with range 18 [document.head, 1, document.head, 1] and point 87 [xmlDoctype, 0] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 29 [document.head, 1] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 29 [document.head, 1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 30 [document.body, 3] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 45 [document, -1] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 45 [document, -1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 46 [document, 0] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 46 [document, 0] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 47 [document, 1] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 47 [document, 1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 48 [document, 2] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 48 [document, 2] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 49 [document, 3] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 49 [document, 3] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 50 [comment, -1] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 19 [document.body, 0, document.body, 1] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 50 [comment, -1] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 51 [comment, 0] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 51 [comment, 0] 
+PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 52 [comment, 4] 
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 52 [comment, 4] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 53 [comment, 96] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 53 [comment, 96] 
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
 </p><p id...
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 19 [document.body, 0, document.body, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct 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 extend() backwards with range 19 [document.body, 0, document.body, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 85 [doctype, 1] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 19 [document.body, 0, document.body, 1] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 19 [document.body, 0, document.body, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
+PASS extend() backwards with range 19 [document.body, 0, document.body, 1] and point 87 [xmlDoctype, 0] 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/extend-20-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/extend-20-expected.txt
new file mode 100644
index 0000000..d13b978
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/extend-20-expected.txt
@@ -0,0 +1,3987 @@
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+CONSOLE ERROR: line 944: The given range isn't in document.
+This is a testharness.js-based test.
+Found 3168 tests; 1296 PASS, 1872 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 0 [paras[0].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 1 [paras[0].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 2 [paras[0].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 3 [paras[0].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 4 [paras[0].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 5 [paras[0].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 6 [paras[0].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 7 [paras[0].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 8 [paras[1].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 9 [paras[1].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 10 [paras[1].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 11 [paras[1].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 12 [paras[1].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 13 [paras[1].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 14 [paras[1].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 15 [paras[1].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 16 [detachedPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 17 [detachedPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 18 [detachedPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 19 [detachedPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 20 [foreignPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 21 [foreignPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 22 [foreignPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 23 [foreignPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 24 [document.documentElement, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 25 [document.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 26 [document.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 27 [document.documentElement, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 28 [document.documentElement, 7] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 29 [document.head, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 30 [document.body, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 31 [foreignDoc.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 32 [foreignDoc.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 33 [foreignDoc.head, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 34 [foreignDoc.body, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 35 [paras[0], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 36 [paras[0], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 37 [paras[0], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 38 [paras[1], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 39 [paras[1], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 40 [paras[1], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 41 [detachedPara1, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 42 [detachedPara1, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 43 [testDiv, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 44 [testDiv, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 45 [document, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 46 [document, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 47 [document, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 48 [document, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 49 [document, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 50 [comment, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 51 [comment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 52 [comment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 53 [comment, 96] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 54 [foreignDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 55 [foreignDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 56 [foreignComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 57 [foreignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 58 [foreignTextNode, 36] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 59 [xmlDoc, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 60 [xmlDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 61 [xmlDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 62 [xmlDoc, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 63 [xmlComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 64 [xmlComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 65 [processingInstruction, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 66 [processingInstruction, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 67 [processingInstruction, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 68 [detachedTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 69 [detachedTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 70 [detachedForeignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 71 [detachedForeignTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 72 [detachedXmlTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 73 [detachedXmlTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 74 [detachedProcessingInstruction, 12] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 75 [detachedComment, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 76 [detachedComment, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 77 [detachedForeignComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 78 [detachedForeignComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 79 [detachedXmlComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 80 [docfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 81 [foreignDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 82 [xmlDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 83 [doctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 84 [doctype, -17] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 85 [doctype, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 86 [foreignDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 87 [xmlDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 0 [paras[0].firstChild, -1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 1 [paras[0].firstChild, 0] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 2 [paras[0].firstChild, 1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 3 [paras[0].firstChild, 2] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 4 [paras[0].firstChild, 8] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 5 [paras[0].firstChild, 9] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 6 [paras[0].firstChild, 10] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 8 [paras[1].firstChild, -1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 9 [paras[1].firstChild, 0] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 10 [paras[1].firstChild, 1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 11 [paras[1].firstChild, 2] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 12 [paras[1].firstChild, 8] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 13 [paras[1].firstChild, 9] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 14 [paras[1].firstChild, 10] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 24 [document.documentElement, -1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 25 [document.documentElement, 0] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 26 [document.documentElement, 1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 27 [document.documentElement, 2] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 28 [document.documentElement, 7] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 29 [document.head, 1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 30 [document.body, 3] 
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 35 [paras[0], 0] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 36 [paras[0], 1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 37 [paras[0], 2] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 38 [paras[1], 0] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 39 [paras[1], 1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 40 [paras[1], 2] 
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 43 [testDiv, 0] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 44 [testDiv, 3] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 45 [document, -1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 46 [document, 0] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 47 [document, 1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 48 [document, 2] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 49 [document, 3] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 50 [comment, -1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 51 [comment, 0] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 52 [comment, 4] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 53 [comment, 96] 
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 59 [xmlDoc, -1] 
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 62 [xmlDoc, 5] 
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 83 [doctype, 0] 
+FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 85 [doctype, 1] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 86 [foreignDoctype, 0] 
+PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 29 [document.head, 1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 29 [document.head, 1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 30 [document.body, 3] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 45 [document, -1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 45 [document, -1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 46 [document, 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 46 [document, 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 47 [document, 1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 47 [document, 1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 48 [document, 2] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 48 [document, 2] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 49 [document, 3] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 49 [document, 3] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 50 [comment, -1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 50 [comment, -1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 51 [comment, 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 51 [comment, 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 52 [comment, 4] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 52 [comment, 4] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 53 [comment, 96] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 53 [comment, 96] 
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 83 [doctype, 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 85 [doctype, 1] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 85 [doctype, 1] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 87 [xmlDoctype, 0] 
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 0 [paras[0].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 1 [paras[0].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 2 [paras[0].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 3 [paras[0].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 4 [paras[0].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 5 [paras[0].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 6 [paras[0].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 7 [paras[0].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 8 [paras[1].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 9 [paras[1].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 10 [paras[1].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 11 [paras[1].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 12 [paras[1].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 13 [paras[1].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 14 [paras[1].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 15 [paras[1].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 16 [detachedPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 17 [detachedPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 18 [detachedPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 19 [detachedPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 20 [foreignPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 21 [foreignPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 22 [foreignPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 23 [foreignPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 24 [document.documentElement, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 25 [document.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 26 [document.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 27 [document.documentElement, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 28 [document.documentElement, 7] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 29 [document.head, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 30 [document.body, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 31 [foreignDoc.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 32 [foreignDoc.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 33 [foreignDoc.head, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 34 [foreignDoc.body, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 35 [paras[0], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 36 [paras[0], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 37 [paras[0], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 38 [paras[1], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 39 [paras[1], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 40 [paras[1], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 41 [detachedPara1, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 42 [detachedPara1, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 43 [testDiv, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 44 [testDiv, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 45 [document, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 46 [document, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 47 [document, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 48 [document, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 49 [document, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 50 [comment, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 51 [comment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 52 [comment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 53 [comment, 96] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 54 [foreignDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 55 [foreignDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 56 [foreignComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 57 [foreignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 58 [foreignTextNode, 36] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 59 [xmlDoc, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 60 [xmlDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 61 [xmlDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 62 [xmlDoc, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 63 [xmlComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 64 [xmlComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 65 [processingInstruction, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 66 [processingInstruction, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 67 [processingInstruction, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 68 [detachedTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 69 [detachedTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 70 [detachedForeignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 71 [detachedForeignTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 72 [detachedXmlTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 73 [detachedXmlTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 74 [detachedProcessingInstruction, 12] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 75 [detachedComment, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 76 [detachedComment, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 77 [detachedForeignComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 78 [detachedForeignComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 79 [detachedXmlComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 80 [docfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 81 [foreignDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 82 [xmlDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 83 [doctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 84 [doctype, -17] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 85 [doctype, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 86 [foreignDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 87 [xmlDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 29 [document.head, 1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 29 [document.head, 1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 30 [document.body, 3] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 45 [document, -1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 45 [document, -1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 46 [document, 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 46 [document, 0] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 47 [document, 1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 47 [document, 1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 48 [document, 2] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 48 [document, 2] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 49 [document, 3] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 49 [document, 3] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 50 [comment, -1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 50 [comment, -1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 51 [comment, 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 51 [comment, 0] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 52 [comment, 4] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 52 [comment, 4] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 53 [comment, 96] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 53 [comment, 96] 
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 83 [doctype, 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 85 [doctype, 1] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 85 [doctype, 1] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 29 [document.head, 1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 29 [document.head, 1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 30 [document.body, 3] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 45 [document, -1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 45 [document, -1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 46 [document, 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 46 [document, 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 47 [document, 1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 47 [document, 1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 48 [document, 2] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 48 [document, 2] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 49 [document, 3] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 49 [document, 3] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 50 [comment, -1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 50 [comment, -1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 51 [comment, 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 51 [comment, 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 52 [comment, 4] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 52 [comment, 4] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 53 [comment, 96] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 53 [comment, 96] 
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Ijklmnop
+"
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 83 [doctype, 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 85 [doctype, 1] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 85 [doctype, 1] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 29 [document.head, 1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 29 [document.head, 1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 30 [document.body, 3] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="d" style="display:none">Yzabcdef</p>
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 45 [document, -1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 45 [document, -1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 46 [document, 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 46 [document, 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 47 [document, 1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 47 [document, 1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 48 [document, 2] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 48 [document, 2] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 49 [document, 3] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 49 [document, 3] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 50 [comment, -1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 50 [comment, -1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 51 [comment, 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 51 [comment, 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 52 [comment, 4] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 52 [comment, 4] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 53 [comment, 96] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 53 [comment, 96] 
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 83 [doctype, 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 85 [doctype, 1] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 85 [doctype, 1] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 29 [document.head, 1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 29 [document.head, 1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 30 [document.body, 3] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 45 [document, -1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 45 [document, -1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 46 [document, 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 46 [document, 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 47 [document, 1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 47 [document, 1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 48 [document, 2] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 48 [document, 2] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 49 [document, 3] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 49 [document, 3] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 50 [comment, -1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 50 [comment, -1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 51 [comment, 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 51 [comment, 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 52 [comment, 4] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 52 [comment, 4] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 53 [comment, 96] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 53 [comment, 96] 
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p>
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
+"
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 83 [doctype, 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 85 [doctype, 1] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 85 [doctype, 1] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 29 [document.head, 1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 29 [document.head, 1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 30 [document.body, 3] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="e" style="display:none">Ghijklmn</p>
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 45 [document, -1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 45 [document, -1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 46 [document, 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 46 [document, 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 47 [document, 1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 47 [document, 1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 48 [document, 2] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 48 [document, 2] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 49 [document, 3] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 49 [document, 3] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 50 [comment, -1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 50 [comment, -1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 51 [comment, 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 51 [comment, 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 52 [comment, 4] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 52 [comment, 4] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 53 [comment, 96] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 53 [comment, 96] 
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="e" style="display:none">Ghijklmn</p>
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="e" style="display:none">Ghijklmn</p>
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="e" style="display:none">Ghijklmn</p>
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="e" style="display:none">Ghijklmn</p>
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 83 [doctype, 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 85 [doctype, 1] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 85 [doctype, 1] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 29 [document.head, 1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 29 [document.head, 1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 30 [document.body, 3] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Qrstuvwx"
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Qrstuvwx"
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 45 [document, -1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 45 [document, -1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 46 [document, 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 46 [document, 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 47 [document, 1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 47 [document, 1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 48 [document, 2] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 48 [document, 2] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 49 [document, 3] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 49 [document, 3] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 50 [comment, -1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 50 [comment, -1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 51 [comment, 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 51 [comment, 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 52 [comment, 4] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 52 [comment, 4] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 53 [comment, 96] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 53 [comment, 96] 
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Qrstuvwx"
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Qrstuvwx"
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 83 [doctype, 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 85 [doctype, 1] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 85 [doctype, 1] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 29 [document.head, 1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 29 [document.head, 1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 30 [document.body, 3] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 45 [document, -1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 45 [document, -1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 46 [document, 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 46 [document, 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 47 [document, 1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 47 [document, 1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 48 [document, 2] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 48 [document, 2] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 49 [document, 3] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 49 [document, 3] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 50 [comment, -1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 50 [comment, -1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 51 [comment, 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 51 [comment, 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 52 [comment, 4] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 52 [comment, 4] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 53 [comment, 96] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 53 [comment, 96] 
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
+<meta...
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id...
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 83 [doctype, 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 85 [doctype, 1] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 85 [doctype, 1] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 87 [xmlDoctype, 0] 
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 0 [paras[0].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 1 [paras[0].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 2 [paras[0].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 3 [paras[0].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 4 [paras[0].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 5 [paras[0].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 6 [paras[0].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 7 [paras[0].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 8 [paras[1].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 9 [paras[1].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 10 [paras[1].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 11 [paras[1].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 12 [paras[1].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 13 [paras[1].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 14 [paras[1].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 15 [paras[1].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 16 [detachedPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 17 [detachedPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 18 [detachedPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 19 [detachedPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 20 [foreignPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 21 [foreignPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 22 [foreignPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 23 [foreignPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 24 [document.documentElement, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 25 [document.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 26 [document.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 27 [document.documentElement, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 28 [document.documentElement, 7] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 29 [document.head, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 30 [document.body, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 31 [foreignDoc.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 32 [foreignDoc.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 33 [foreignDoc.head, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 34 [foreignDoc.body, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 35 [paras[0], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 36 [paras[0], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 37 [paras[0], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 38 [paras[1], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 39 [paras[1], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 40 [paras[1], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 41 [detachedPara1, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 42 [detachedPara1, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 43 [testDiv, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 44 [testDiv, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 45 [document, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 46 [document, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 47 [document, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 48 [document, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 49 [document, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 50 [comment, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 51 [comment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 52 [comment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 53 [comment, 96] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 54 [foreignDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 55 [foreignDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 56 [foreignComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 57 [foreignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 58 [foreignTextNode, 36] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 59 [xmlDoc, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 60 [xmlDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 61 [xmlDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 62 [xmlDoc, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 63 [xmlComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 64 [xmlComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 65 [processingInstruction, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 66 [processingInstruction, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 67 [processingInstruction, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 68 [detachedTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 69 [detachedTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 70 [detachedForeignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 71 [detachedForeignTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 72 [detachedXmlTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 73 [detachedXmlTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 74 [detachedProcessingInstruction, 12] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 75 [detachedComment, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 76 [detachedComment, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 77 [detachedForeignComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 78 [detachedForeignComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 79 [detachedXmlComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 80 [docfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 81 [foreignDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 82 [xmlDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 83 [doctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 84 [doctype, -17] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 85 [doctype, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 86 [foreignDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
+FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 87 [xmlDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 29 [document.head, 1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 29 [document.head, 1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 30 [document.body, 3] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 45 [document, -1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 45 [document, -1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 46 [document, 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 46 [document, 0] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 47 [document, 1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 47 [document, 1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 48 [document, 2] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 48 [document, 2] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 49 [document, 3] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 49 [document, 3] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 50 [comment, -1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 50 [comment, -1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 51 [comment, 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 51 [comment, 0] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 52 [comment, 4] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 52 [comment, 4] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 53 [comment, 96] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 53 [comment, 96] 
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 83 [doctype, 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 35 [document, 0, document, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 35 [document, 0, document, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 85 [doctype, 1] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 85 [doctype, 1] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 35 [document, 0, document, 1] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 35 [document, 0, document, 1] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 29 [document.head, 1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 29 [document.head, 1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 30 [document.body, 3] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 45 [document, -1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 45 [document, -1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 46 [document, 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 46 [document, 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 47 [document, 1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 47 [document, 1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 48 [document, 2] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 48 [document, 2] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 49 [document, 3] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 49 [document, 3] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 50 [comment, -1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 50 [comment, -1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 51 [comment, 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 51 [comment, 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 52 [comment, 4] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 52 [comment, 4] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 53 [comment, 96] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 53 [comment, 96] 
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 83 [doctype, 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 36 [document, 0, document, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 36 [document, 0, document, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 85 [doctype, 1] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 85 [doctype, 1] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 36 [document, 0, document, 2] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 36 [document, 0, document, 2] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 29 [document.head, 1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 29 [document.head, 1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 30 [document.body, 3] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 45 [document, -1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 45 [document, -1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 46 [document, 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 46 [document, 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 47 [document, 1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 47 [document, 1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 48 [document, 2] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 48 [document, 2] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 49 [document, 3] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 49 [document, 3] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 50 [comment, -1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 50 [comment, -1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 51 [comment, 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 51 [comment, 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 52 [comment, 4] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 52 [comment, 4] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 53 [comment, 96] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 53 [comment, 96] 
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 83 [doctype, 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 37 [document, 1, document, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 37 [document, 1, document, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 85 [doctype, 1] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 85 [doctype, 1] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 37 [document, 1, document, 2] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 37 [document, 1, document, 2] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 29 [document.head, 1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 29 [document.head, 1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 30 [document.body, 3] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 45 [document, -1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 45 [document, -1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 46 [document, 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 46 [document, 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 47 [document, 1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 47 [document, 1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 48 [document, 2] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 48 [document, 2] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 49 [document, 3] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 49 [document, 3] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 50 [comment, -1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 50 [comment, -1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 51 [comment, 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 51 [comment, 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 52 [comment, 4] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 52 [comment, 4] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 53 [comment, 96] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 53 [comment, 96] 
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
+</p><p id="b" s...
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 83 [doctype, 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 38 [testDiv, 0, comment, 5] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 85 [doctype, 1] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 85 [doctype, 1] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 38 [testDiv, 0, comment, 5] and point 87 [xmlDoctype, 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 0 [paras[0].firstChild, -1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 6 [paras[0].firstChild, 10] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 7 [paras[0].firstChild, 65535] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 8 [paras[1].firstChild, -1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 13 [paras[1].firstChild, 9] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 14 [paras[1].firstChild, 10] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 14 [paras[1].firstChild, 10] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 15 [paras[1].firstChild, 65535] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 15 [paras[1].firstChild, 65535] 
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 19 [detachedPara1.firstChild, 9] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 19 [detachedPara1.firstChild, 9] 
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 23 [foreignPara1.firstChild, 9] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 24 [document.documentElement, -1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 27 [document.documentElement, 2] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 28 [document.documentElement, 7] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 29 [document.head, 1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 29 [document.head, 1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 30 [document.body, 3] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 30 [document.body, 3] 
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 36 [paras[0], 1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 37 [paras[0], 2] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 39 [paras[1], 1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 40 [paras[1], 2] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 40 [paras[1], 2] 
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 44 [testDiv, 3] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 45 [document, -1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 45 [document, -1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 46 [document, 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 46 [document, 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 47 [document, 1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 47 [document, 1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 48 [document, 2] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 48 [document, 2] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 49 [document, 3] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 49 [document, 3] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 50 [comment, -1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 50 [comment, -1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 51 [comment, 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 51 [comment, 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 52 [comment, 4] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 52 [comment, 4] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 53 [comment, 96] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 53 [comment, 96] 
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 59 [xmlDoc, -1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 59 [xmlDoc, -1] 
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 62 [xmlDoc, 5] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 62 [xmlDoc, 5] 
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Comment node <!--Alphabet soup?-->
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 83 [doctype, 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 83 [doctype, 0] 
+FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 85 [doctype, 1] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 85 [doctype, 1] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 86 [foreignDoctype, 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 86 [foreignDoctype, 0] 
+PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 87 [xmlDoctype, 0] 
+PASS extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 87 [xmlDoctype, 0] 
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/selection/extend-40-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/selection/extend-40-expected.txt
index c70b4d23..b1ea770 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/selection/extend-40-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/selection/extend-40-expected.txt
@@ -351,185 +351,187 @@
 CONSOLE ERROR: line 944: The given range isn't in document.
 CONSOLE ERROR: line 944: The given range isn't in document.
 This is a testharness.js-based test.
-Found 2552 tests; 21 PASS, 2531 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 2552 tests; 96 PASS, 2456 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 0 [paras[0].firstChild, -1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 1 [paras[0].firstChild, 0] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 1 [paras[0].firstChild, 0] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 2 [paras[0].firstChild, 1] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 2 [paras[0].firstChild, 1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 3 [paras[0].firstChild, 2] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 3 [paras[0].firstChild, 2] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 4 [paras[0].firstChild, 8] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 4 [paras[0].firstChild, 8] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 5 [paras[0].firstChild, 9] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 5 [paras[0].firstChild, 9] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 6 [paras[0].firstChild, 10] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 6 [paras[0].firstChild, 10] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 7 [paras[0].firstChild, 65535] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 8 [paras[1].firstChild, -1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 9 [paras[1].firstChild, 0] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 9 [paras[1].firstChild, 0] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 10 [paras[1].firstChild, 1] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 10 [paras[1].firstChild, 1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 11 [paras[1].firstChild, 2] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 11 [paras[1].firstChild, 2] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 12 [paras[1].firstChild, 8] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 12 [paras[1].firstChild, 8] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 13 [paras[1].firstChild, 9] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 13 [paras[1].firstChild, 9] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 14 [paras[1].firstChild, 10] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 15 [paras[1].firstChild, 65535] 
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Comment node <!--Alphabet soup?-->
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 19 [detachedPara1.firstChild, 9] 
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Comment node <!--Alphabet soup?-->
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 23 [foreignPara1.firstChild, 9] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 24 [document.documentElement, -1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 25 [document.documentElement, 0] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 25 [document.documentElement, 0] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 26 [document.documentElement, 1] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 26 [document.documentElement, 1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 27 [document.documentElement, 2] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 27 [document.documentElement, 2] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 28 [document.documentElement, 7] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 29 [document.head, 1] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 29 [document.head, 1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 30 [document.body, 3] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 30 [document.body, 3] 
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 35 [paras[0], 0] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 35 [paras[0], 0] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 36 [paras[0], 1] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 36 [paras[0], 1] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 37 [paras[0], 2] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 38 [paras[1], 0] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 38 [paras[1], 0] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 39 [paras[1], 1] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 39 [paras[1], 1] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 40 [paras[1], 2] 
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Comment node <!--Alphabet soup?-->
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 43 [testDiv, 0] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 43 [testDiv, 0] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 44 [testDiv, 3] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 44 [testDiv, 3] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 45 [document, -1] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 45 [document, -1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 46 [document, 0] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 46 [document, 0] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 47 [document, 1] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 47 [document, 1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 48 [document, 2] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 48 [document, 2] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 49 [document, 3] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 49 [document, 3] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 50 [comment, -1] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 50 [comment, -1] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 51 [comment, 0] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 51 [comment, 0] 
+PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 52 [comment, 4] 
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 52 [comment, 4] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 53 [comment, 96] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 53 [comment, 96] 
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Comment node <!--Alphabet soup?-->
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 59 [xmlDoc, -1] 
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Comment node <!--Alphabet soup?-->
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 62 [xmlDoc, 5] 
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Comment node <!--Alphabet soup?-->
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="d" style="display:none">Yzabcdef</p>
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Comment node <!--Alphabet soup?-->
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 83 [doctype, 0] 
 FAIL extend() forwards with range 40 [paras[3], 1, comment, 8] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
             selection.extend(node, offset);
         }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
+            selection.extend(node, offset);
+        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 85 [doctype, 1] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 86 [foreignDoctype, 0] 
 PASS extend() forwards with range 40 [paras[3], 1, comment, 8] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 40 [paras[3], 1, comment, 8] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="d" style="display:none">Yzabcdef</p> but got Text node "Qrstuvwx"
+PASS extend() backwards with range 40 [paras[3], 1, comment, 8] and point 87 [xmlDoctype, 0] 
 FAIL extend() with range 41 [foreignDoc, 0, foreignDoc, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
 FAIL extend() with range 41 [foreignDoc, 0, foreignDoc, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
 FAIL extend() with range 41 [foreignDoc, 0, foreignDoc, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
diff --git a/third_party/WebKit/LayoutTests/fast/dynamic/move-node-with-selection.html b/third_party/WebKit/LayoutTests/fast/dynamic/move-node-with-selection.html
index 000e73b..2b4a240 100644
--- a/third_party/WebKit/LayoutTests/fast/dynamic/move-node-with-selection.html
+++ b/third_party/WebKit/LayoutTests/fast/dynamic/move-node-with-selection.html
@@ -13,8 +13,8 @@
     },
     [
         '<div id="dest">',
-            '<div id="target" style="display: inline;">Lorem ipsum|</div>',
-        '</div>',
+            '<div id="target" style="display: inline;">Lorem ipsum</div>',
+        '</div>|',
     ].join('')),
     'Modify and move a container node of selection');
 </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/README.txt b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/README.txt
new file mode 100644
index 0000000..9eb9b43
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/README.txt
@@ -0,0 +1,3 @@
+These tests exercise Chromium/Blink specific behavior (like garbage
+collection, not crashing, etc) and will not be upstreamed to the
+W3C web-platform-tests.
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/import-on-detached-iframe.html b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/import-on-detached-iframe.html
new file mode 100644
index 0000000..bbba102
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/import-on-detached-iframe.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Worklet: import() on a detached iframe</title>
+<body>
+</body>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script>
+
+function with_iframe(url) {
+  return new Promise(resolve => {
+      let frame = document.createElement('iframe');
+      frame.src = url;
+      frame.onload = () => { resolve(frame); };
+      document.body.appendChild(frame);
+      add_result_callback(() => frame.remove());
+    });
+}
+
+// This test should be in chromium/ because the spec does not define behavior in
+// the case where import() is called from a detached frame.
+promise_test(t => {
+  const kFrameUrl = 'resources/blank.html';
+  const kScriptUrl = 'resources/empty-worklet-script.js';
+
+  return with_iframe(kFrameUrl)
+    .then(frame => {
+        let worklet = frame.contentWindow.paintWorklet;
+        frame.remove();
+        return worklet.import(kScriptUrl);
+      })
+    .then(() => assert_unreached('import() should fail.'))
+    .catch(e => assert_equals(e.name, 'InvalidStateError', e));
+}, 'import() on a detached iframe should be rejected.');
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/resources/blank.html b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/resources/blank.html
new file mode 100644
index 0000000..d6788da5
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/resources/blank.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<title>Empty document</title>
diff --git a/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/resources/empty-worklet-script.js b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/resources/empty-worklet-script.js
new file mode 100644
index 0000000..49ceb264
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/worklet/chromium/resources/empty-worklet-script.js
@@ -0,0 +1 @@
+// Do nothing.
diff --git a/third_party/WebKit/LayoutTests/platform/win/external/wpt/selection/extend-20-expected.txt b/third_party/WebKit/LayoutTests/platform/win/external/wpt/selection/extend-20-expected.txt
deleted file mode 100644
index 5d83427..0000000
--- a/third_party/WebKit/LayoutTests/platform/win/external/wpt/selection/extend-20-expected.txt
+++ /dev/null
@@ -1,5561 +0,0 @@
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-CONSOLE ERROR: line 944: The given range isn't in document.
-This is a testharness.js-based test.
-Found 3168 tests; 308 PASS, 2860 FAIL, 0 TIMEOUT, 0 NOTRUN.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 0 [paras[0].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 1 [paras[0].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 2 [paras[0].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 3 [paras[0].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 4 [paras[0].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 5 [paras[0].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 6 [paras[0].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 7 [paras[0].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 8 [paras[1].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 9 [paras[1].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 10 [paras[1].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 11 [paras[1].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 12 [paras[1].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 13 [paras[1].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 14 [paras[1].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 15 [paras[1].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 16 [detachedPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 17 [detachedPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 18 [detachedPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 19 [detachedPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 20 [foreignPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 21 [foreignPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 22 [foreignPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 23 [foreignPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 24 [document.documentElement, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 25 [document.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 26 [document.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 27 [document.documentElement, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 28 [document.documentElement, 7] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 29 [document.head, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 30 [document.body, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 31 [foreignDoc.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 32 [foreignDoc.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 33 [foreignDoc.head, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 34 [foreignDoc.body, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 35 [paras[0], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 36 [paras[0], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 37 [paras[0], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 38 [paras[1], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 39 [paras[1], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 40 [paras[1], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 41 [detachedPara1, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 42 [detachedPara1, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 43 [testDiv, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 44 [testDiv, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 45 [document, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 46 [document, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 47 [document, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 48 [document, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 49 [document, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 50 [comment, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 51 [comment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 52 [comment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 53 [comment, 96] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 54 [foreignDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 55 [foreignDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 56 [foreignComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 57 [foreignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 58 [foreignTextNode, 36] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 59 [xmlDoc, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 60 [xmlDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 61 [xmlDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 62 [xmlDoc, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 63 [xmlComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 64 [xmlComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 65 [processingInstruction, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 66 [processingInstruction, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 67 [processingInstruction, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 68 [detachedTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 69 [detachedTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 70 [detachedForeignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 71 [detachedForeignTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 72 [detachedXmlTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 73 [detachedXmlTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 74 [detachedProcessingInstruction, 12] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 75 [detachedComment, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 76 [detachedComment, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 77 [detachedForeignComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 78 [detachedForeignComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 79 [detachedXmlComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 80 [docfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 81 [foreignDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 82 [xmlDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 83 [doctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 84 [doctype, -17] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 85 [doctype, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 86 [foreignDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 20 [foreignDoc.documentElement, 0, foreignDoc.documentElement, 1] and point 87 [xmlDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 21 [foreignDoc.head, 1, foreignDoc.head, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 22 [foreignDoc.body, 0, foreignDoc.body, 0] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 7 [paras[0].firstChild, 65535] 
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 14 [paras[1].firstChild, 10] 
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 23 [foreignPara1.firstChild, 9] 
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 24 [document.documentElement, -1] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 28 [document.documentElement, 7] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 37 [paras[0], 2] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 40 [paras[1], 2] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 45 [document, -1] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 49 [document, 3] 
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 50 [comment, -1] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 53 [comment, 96] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 59 [xmlDoc, -1] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 62 [xmlDoc, 5] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 83 [doctype, 0] 
-FAIL extend() with range 23 [paras[0], 0, paras[0], 0] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 85 [doctype, 1] 
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 86 [foreignDoctype, 0] 
-PASS extend() with range 23 [paras[0], 0, paras[0], 0] and point 87 [xmlDoctype, 0] 
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 45 [document, -1] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 49 [document, 3] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 50 [comment, -1] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 53 [comment, 96] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 24 [paras[0], 0, paras[0], 1] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 24 [paras[0], 0, paras[0], 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() with range 25 [detachedPara1, 0, detachedPara1, 0] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 0 [paras[0].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 1 [paras[0].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 2 [paras[0].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 3 [paras[0].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 4 [paras[0].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 5 [paras[0].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 6 [paras[0].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 7 [paras[0].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 8 [paras[1].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 9 [paras[1].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 10 [paras[1].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 11 [paras[1].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 12 [paras[1].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 13 [paras[1].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 14 [paras[1].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 15 [paras[1].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 16 [detachedPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 17 [detachedPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 18 [detachedPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 19 [detachedPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 20 [foreignPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 21 [foreignPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 22 [foreignPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 23 [foreignPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 24 [document.documentElement, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 25 [document.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 26 [document.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 27 [document.documentElement, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 28 [document.documentElement, 7] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 29 [document.head, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 30 [document.body, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 31 [foreignDoc.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 32 [foreignDoc.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 33 [foreignDoc.head, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 34 [foreignDoc.body, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 35 [paras[0], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 36 [paras[0], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 37 [paras[0], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 38 [paras[1], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 39 [paras[1], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 40 [paras[1], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 41 [detachedPara1, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 42 [detachedPara1, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 43 [testDiv, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 44 [testDiv, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 45 [document, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 46 [document, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 47 [document, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 48 [document, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 49 [document, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 50 [comment, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 51 [comment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 52 [comment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 53 [comment, 96] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 54 [foreignDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 55 [foreignDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 56 [foreignComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 57 [foreignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 58 [foreignTextNode, 36] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 59 [xmlDoc, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 60 [xmlDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 61 [xmlDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 62 [xmlDoc, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 63 [xmlComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 64 [xmlComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 65 [processingInstruction, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 66 [processingInstruction, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 67 [processingInstruction, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 68 [detachedTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 69 [detachedTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 70 [detachedForeignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 71 [detachedForeignTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 72 [detachedXmlTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 73 [detachedXmlTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 74 [detachedProcessingInstruction, 12] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 75 [detachedComment, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 76 [detachedComment, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 77 [detachedForeignComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 78 [detachedForeignComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 79 [detachedXmlComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 80 [docfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 81 [foreignDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 82 [xmlDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 83 [doctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 84 [doctype, -17] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 85 [doctype, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 86 [foreignDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 26 [detachedPara1, 0, detachedPara1, 1] and point 87 [xmlDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 1 [paras[0].firstChild, 0] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 2 [paras[0].firstChild, 1] assert_equals: focusOffset must be the offset passed to extend() expected 1 but got 2
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 3 [paras[0].firstChild, 2] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 4 [paras[0].firstChild, 8] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 5 [paras[0].firstChild, 9] assert_equals: focusOffset must be the offset passed to extend() expected 9 but got 10
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 6 [paras[0].firstChild, 10] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 9 [paras[1].firstChild, 0] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 10 [paras[1].firstChild, 1] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 11 [paras[1].firstChild, 2] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 12 [paras[1].firstChild, 8] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 13 [paras[1].firstChild, 9] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 24 [document.documentElement, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 25 [document.documentElement, 0] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 25 [document.documentElement, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 26 [document.documentElement, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 26 [document.documentElement, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 27 [document.documentElement, 2] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 27 [document.documentElement, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 28 [document.documentElement, 7] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 29 [document.head, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 29 [document.head, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 30 [document.body, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 30 [document.body, 3] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 35 [paras[0], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 35 [paras[0], 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 36 [paras[0], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 36 [paras[0], 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 37 [paras[0], 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 38 [paras[1], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 38 [paras[1], 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 39 [paras[1], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 39 [paras[1], 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 40 [paras[1], 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 41 [detachedPara1, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 42 [detachedPara1, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 43 [testDiv, 0] assert_equals: focusNode must be the node passed to extend() 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 extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 43 [testDiv, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 44 [testDiv, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 44 [testDiv, 3] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 45 [document, -1] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 45 [document, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 46 [document, 0] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 46 [document, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 47 [document, 1] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 47 [document, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 48 [document, 2] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 48 [document, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 49 [document, 3] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 49 [document, 3] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 50 [comment, -1] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 50 [comment, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 51 [comment, 0] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 51 [comment, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 52 [comment, 4] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 52 [comment, 4] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 53 [comment, 96] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 53 [comment, 96] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 54 [foreignDoc, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 55 [foreignDoc, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 56 [foreignComment, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 59 [xmlDoc, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 60 [xmlDoc, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 61 [xmlDoc, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 62 [xmlDoc, 5] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 63 [xmlComment, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 64 [xmlComment, 4] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 65 [processingInstruction, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 66 [processingInstruction, 5] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 67 [processingInstruction, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 75 [detachedComment, 3] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 76 [detachedComment, 5] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 80 [docfrag, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 83 [doctype, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 84 [doctype, -17] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 85 [doctype, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 27 [paras[0].firstChild, 0, paras[1].firstChild, 0] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 1 [paras[0].firstChild, 0] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 2 [paras[0].firstChild, 1] assert_equals: focusOffset must be the offset passed to extend() expected 1 but got 2
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 3 [paras[0].firstChild, 2] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 4 [paras[0].firstChild, 8] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 5 [paras[0].firstChild, 9] assert_equals: focusOffset must be the offset passed to extend() expected 9 but got 10
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 6 [paras[0].firstChild, 10] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 9 [paras[1].firstChild, 0] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 10 [paras[1].firstChild, 1] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 11 [paras[1].firstChild, 2] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 12 [paras[1].firstChild, 8] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 13 [paras[1].firstChild, 9] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 24 [document.documentElement, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 25 [document.documentElement, 0] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 25 [document.documentElement, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 26 [document.documentElement, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 26 [document.documentElement, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 27 [document.documentElement, 2] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 27 [document.documentElement, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 28 [document.documentElement, 7] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 29 [document.head, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 29 [document.head, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 30 [document.body, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 30 [document.body, 3] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 35 [paras[0], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 35 [paras[0], 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 36 [paras[0], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 36 [paras[0], 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 37 [paras[0], 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 38 [paras[1], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 38 [paras[1], 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 39 [paras[1], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 39 [paras[1], 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 40 [paras[1], 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 41 [detachedPara1, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 42 [detachedPara1, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 43 [testDiv, 0] assert_equals: focusNode must be the node passed to extend() 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 extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 43 [testDiv, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 44 [testDiv, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 44 [testDiv, 3] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 45 [document, -1] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 45 [document, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 46 [document, 0] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 46 [document, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 47 [document, 1] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 47 [document, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 48 [document, 2] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 48 [document, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 49 [document, 3] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 49 [document, 3] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 50 [comment, -1] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 50 [comment, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 51 [comment, 0] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 51 [comment, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 52 [comment, 4] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 52 [comment, 4] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 53 [comment, 96] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 53 [comment, 96] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 54 [foreignDoc, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 55 [foreignDoc, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 56 [foreignComment, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 59 [xmlDoc, -1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 60 [xmlDoc, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 61 [xmlDoc, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 62 [xmlDoc, 5] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 63 [xmlComment, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 64 [xmlComment, 4] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 65 [processingInstruction, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 66 [processingInstruction, 5] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 67 [processingInstruction, 9] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 75 [detachedComment, 3] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 76 [detachedComment, 5] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 80 [docfrag, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 83 [doctype, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 84 [doctype, -17] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 85 [doctype, 1] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 28 [paras[0].firstChild, 0, paras[1].firstChild, 8] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: endContainer must be correct expected Text node "Ijklmnop
-" but got Element node <p id="c">Qrstuvwx</p>
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 1 [paras[0].firstChild, 0] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 2 [paras[0].firstChild, 1] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 3 [paras[0].firstChild, 2] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 4 [paras[0].firstChild, 8] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 5 [paras[0].firstChild, 9] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 6 [paras[0].firstChild, 10] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 9 [paras[1].firstChild, 0] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 10 [paras[1].firstChild, 1] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 11 [paras[1].firstChild, 2] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 12 [paras[1].firstChild, 8] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 13 [paras[1].firstChild, 9] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 25 [document.documentElement, 0] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 26 [document.documentElement, 1] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 27 [document.documentElement, 2] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 29 [document.head, 1] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 29 [document.head, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 30 [document.body, 3] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 30 [document.body, 3] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 35 [paras[0], 0] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 35 [paras[0], 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 36 [paras[0], 1] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 36 [paras[0], 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 37 [paras[0], 2] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 38 [paras[1], 0] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 38 [paras[1], 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 39 [paras[1], 1] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 39 [paras[1], 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 40 [paras[1], 2] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 43 [testDiv, 0] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 43 [testDiv, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 44 [testDiv, 3] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 44 [testDiv, 3] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 45 [document, -1] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 45 [document, -1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 46 [document, 0] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 46 [document, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 47 [document, 1] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 47 [document, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 48 [document, 2] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 48 [document, 2] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 49 [document, 3] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 49 [document, 3] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 50 [comment, -1] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 50 [comment, -1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 51 [comment, 0] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 51 [comment, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 52 [comment, 4] assert_equals: anchorOffset must not change if the node passed to extend() has the same root as the original range expected 3 but got 4
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 52 [comment, 4] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 53 [comment, 96] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 53 [comment, 96] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 80 [docfrag, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 83 [doctype, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-FAIL extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 84 [doctype, -17] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 85 [doctype, 1] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 29 [paras[0].firstChild, 3, paras[3], 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startOffset must be correct expected 3 but got 4
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 45 [document, -1] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 49 [document, 3] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 50 [comment, -1] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 53 [comment, 96] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p>
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 30 [paras[0], 0, paras[0].firstChild, 7] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 45 [document, -1] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 49 [document, 3] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 50 [comment, -1] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 53 [comment, 96] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 31 [testDiv, 2, paras[4], 1] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 31 [testDiv, 2, paras[4], 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 45 [document, -1] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Element node <p id="c">Qrstuvwx</p>
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 49 [document, 3] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 50 [comment, -1] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 53 [comment, 96] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 32 [testDiv, 1, paras[2].firstChild, 5] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 45 [document, -1] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 49 [document, 3] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 50 [comment, -1] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 53 [comment, 96] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <html><head><title>Selection extend() tests</title>
-<meta...
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 33 [document.documentElement, 1, document.body, 0] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 33 [document.documentElement, 1, document.body, 0] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 0 [paras[0].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 1 [paras[0].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 2 [paras[0].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 3 [paras[0].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 4 [paras[0].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 5 [paras[0].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 6 [paras[0].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 7 [paras[0].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 8 [paras[1].firstChild, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 9 [paras[1].firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 10 [paras[1].firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 11 [paras[1].firstChild, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 12 [paras[1].firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 13 [paras[1].firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 14 [paras[1].firstChild, 10] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 15 [paras[1].firstChild, 65535] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 16 [detachedPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 17 [detachedPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 18 [detachedPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 19 [detachedPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 20 [foreignPara1.firstChild, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 21 [foreignPara1.firstChild, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 22 [foreignPara1.firstChild, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 23 [foreignPara1.firstChild, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 24 [document.documentElement, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 24 [document.documentElement, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 25 [document.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 25 [document.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 26 [document.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 26 [document.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 27 [document.documentElement, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 27 [document.documentElement, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 28 [document.documentElement, 7] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 28 [document.documentElement, 7] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 29 [document.head, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 29 [document.head, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 30 [document.body, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 30 [document.body, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 31 [foreignDoc.documentElement, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 32 [foreignDoc.documentElement, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 33 [foreignDoc.head, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 34 [foreignDoc.body, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 35 [paras[0], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 35 [paras[0], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 36 [paras[0], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 36 [paras[0], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 37 [paras[0], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 37 [paras[0], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 38 [paras[1], 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 38 [paras[1], 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 39 [paras[1], 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 39 [paras[1], 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 40 [paras[1], 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 40 [paras[1], 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 41 [detachedPara1, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 41 [detachedPara1, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 42 [detachedPara1, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 42 [detachedPara1, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 43 [testDiv, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 43 [testDiv, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 44 [testDiv, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 44 [testDiv, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 45 [document, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 45 [document, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 46 [document, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 46 [document, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 47 [document, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 47 [document, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 48 [document, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 48 [document, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 49 [document, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 49 [document, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 50 [comment, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 50 [comment, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 51 [comment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 51 [comment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 52 [comment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 52 [comment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 53 [comment, 96] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 53 [comment, 96] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 54 [foreignDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 54 [foreignDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 55 [foreignDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 55 [foreignDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 56 [foreignComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 56 [foreignComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 57 [foreignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 58 [foreignTextNode, 36] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 59 [xmlDoc, -1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 59 [xmlDoc, -1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 60 [xmlDoc, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 60 [xmlDoc, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 61 [xmlDoc, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 61 [xmlDoc, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 62 [xmlDoc, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 62 [xmlDoc, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 63 [xmlComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 63 [xmlComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 64 [xmlComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 64 [xmlComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 65 [processingInstruction, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 65 [processingInstruction, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 66 [processingInstruction, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 66 [processingInstruction, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 67 [processingInstruction, 9] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 67 [processingInstruction, 9] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 68 [detachedTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 69 [detachedTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 70 [detachedForeignTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 71 [detachedForeignTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 72 [detachedXmlTextNode, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 73 [detachedXmlTextNode, 8] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 74 [detachedProcessingInstruction, 12] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 75 [detachedComment, 3] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 75 [detachedComment, 3] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 76 [detachedComment, 5] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 76 [detachedComment, 5] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 77 [detachedForeignComment, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 78 [detachedForeignComment, 4] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 79 [detachedXmlComment, 2] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 80 [docfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 80 [docfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 81 [foreignDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 82 [xmlDocfrag, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 83 [doctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 83 [doctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 84 [doctype, -17] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 84 [doctype, -17] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 85 [doctype, 1] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 85 [doctype, 1] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 86 [foreignDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-FAIL extend() forwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: rangeCount must be correct expected 1 but got 0
-FAIL extend() backwards with range 34 [foreignDoc.documentElement, 1, foreignDoc.body, 0] and point 87 [xmlDoctype, 0] Failed to execute 'extend' on 'Selection': This Selection object doesn't have any Ranges.
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 45 [document, -1] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 49 [document, 3] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 50 [comment, -1] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 53 [comment, 96] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 35 [document, 0, document, 1] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 35 [document, 0, document, 1] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 35 [document, 0, document, 1] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 45 [document, -1] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 49 [document, 3] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 50 [comment, -1] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 53 [comment, 96] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 36 [document, 0, document, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 36 [document, 0, document, 2] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 36 [document, 0, document, 2] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 45 [document, -1] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 49 [document, 3] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 50 [comment, -1] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original range expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 53 [comment, 96] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Document node with 2 children
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() forwards with range 37 [document, 1, document, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 37 [document, 1, document, 2] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 37 [document, 1, document, 2] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 1 [paras[0].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 2 [paras[0].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 3 [paras[0].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 4 [paras[0].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 5 [paras[0].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 6 [paras[0].firstChild, 10] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 9 [paras[1].firstChild, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 10 [paras[1].firstChild, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 11 [paras[1].firstChild, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 12 [paras[1].firstChild, 8] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 13 [paras[1].firstChild, 9] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 24 [document.documentElement, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 25 [document.documentElement, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 25 [document.documentElement, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 26 [document.documentElement, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 26 [document.documentElement, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 27 [document.documentElement, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 27 [document.documentElement, 2] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 28 [document.documentElement, 7] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 29 [document.head, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 29 [document.head, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 30 [document.body, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 30 [document.body, 3] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 35 [paras[0], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 35 [paras[0], 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 36 [paras[0], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 36 [paras[0], 1] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 37 [paras[0], 2] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 38 [paras[1], 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 38 [paras[1], 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 39 [paras[1], 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 39 [paras[1], 1] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 40 [paras[1], 2] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 41 [detachedPara1, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 42 [detachedPara1, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 43 [testDiv, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 43 [testDiv, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 44 [testDiv, 3] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 44 [testDiv, 3] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 45 [document, -1] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 45 [document, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 46 [document, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 46 [document, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 47 [document, 1] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 47 [document, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 48 [document, 2] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 48 [document, 2] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 49 [document, 3] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 49 [document, 3] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 50 [comment, -1] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 50 [comment, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 51 [comment, 0] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 51 [comment, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 52 [comment, 4] assert_equals: anchorNode must not change if the node passed to extend() has the same root as the original 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 extend() backwards with range 38 [testDiv, 0, comment, 5] and point 52 [comment, 4] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 53 [comment, 96] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 53 [comment, 96] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 54 [foreignDoc, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 55 [foreignDoc, 1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 56 [foreignComment, 2] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 59 [xmlDoc, -1] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 60 [xmlDoc, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 61 [xmlDoc, 1] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 62 [xmlDoc, 5] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 63 [xmlComment, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 64 [xmlComment, 4] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 65 [processingInstruction, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 66 [processingInstruction, 5] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 67 [processingInstruction, 9] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 75 [detachedComment, 3] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 76 [detachedComment, 5] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 80 [docfrag, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s...
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 83 [doctype, 0] assert_equals: Sanity check: startContainer must be correct 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 extend() forwards with range 38 [testDiv, 0, comment, 5] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 84 [doctype, -17] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 85 [doctype, 1] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 38 [testDiv, 0, comment, 5] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 38 [testDiv, 0, comment, 5] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: startContainer must be correct 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̈ḧ
-"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 0 [paras[0].firstChild, -1] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 0 [paras[0].firstChild, -1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 1 [paras[0].firstChild, 0] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 1 [paras[0].firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 2 [paras[0].firstChild, 1] assert_equals: focusOffset must be the offset passed to extend() expected 1 but got 2
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 2 [paras[0].firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 3 [paras[0].firstChild, 2] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 3 [paras[0].firstChild, 2] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 4 [paras[0].firstChild, 8] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 4 [paras[0].firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 5 [paras[0].firstChild, 9] assert_equals: focusOffset must be the offset passed to extend() expected 9 but got 10
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 5 [paras[0].firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 6 [paras[0].firstChild, 10] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 6 [paras[0].firstChild, 10] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 7 [paras[0].firstChild, 65535] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 7 [paras[0].firstChild, 65535] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 8 [paras[1].firstChild, -1] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 8 [paras[1].firstChild, -1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 9 [paras[1].firstChild, 0] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 9 [paras[1].firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 10 [paras[1].firstChild, 1] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 10 [paras[1].firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 11 [paras[1].firstChild, 2] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 11 [paras[1].firstChild, 2] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 12 [paras[1].firstChild, 8] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 12 [paras[1].firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 13 [paras[1].firstChild, 9] assert_equals: focusNode must be the node passed to extend() expected Text node "Ijklmnop
-" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 13 [paras[1].firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 14 [paras[1].firstChild, 10] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 14 [paras[1].firstChild, 10] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 15 [paras[1].firstChild, 65535] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 15 [paras[1].firstChild, 65535] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 16 [detachedPara1.firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 17 [detachedPara1.firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Opqrstuv" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 18 [detachedPara1.firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 19 [detachedPara1.firstChild, 9] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 19 [detachedPara1.firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 20 [foreignPara1.firstChild, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 21 [foreignPara1.firstChild, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Efghijkl" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 22 [foreignPara1.firstChild, 8] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 23 [foreignPara1.firstChild, 9] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 23 [foreignPara1.firstChild, 9] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 24 [document.documentElement, -1] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 24 [document.documentElement, -1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 25 [document.documentElement, 0] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 25 [document.documentElement, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 26 [document.documentElement, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 26 [document.documentElement, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 27 [document.documentElement, 2] assert_equals: focusNode must be the node passed to extend() expected Element node <html><head><title>Selection extend() tests</title>
-<meta... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 27 [document.documentElement, 2] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 28 [document.documentElement, 7] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 28 [document.documentElement, 7] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 29 [document.head, 1] assert_equals: focusNode must be the node passed to extend() expected Element node <head><title>Selection extend() tests</title>
-<meta chars... but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 29 [document.head, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 30 [document.body, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <body><div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 30 [document.body, 3] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 31 [foreignDoc.documentElement, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <html><head><title></title></head><body><p>Efghijkl</p><p... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 32 [foreignDoc.documentElement, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 33 [foreignDoc.head, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <head><title></title></head> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 33 [foreignDoc.head, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 34 [foreignDoc.body, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <body><p>Efghijkl</p><p>Mnopqrst</p>I admit that I harbor... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 34 [foreignDoc.body, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 35 [paras[0], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 35 [paras[0], 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 36 [paras[0], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p> but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 36 [paras[0], 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 37 [paras[0], 2] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 37 [paras[0], 2] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 38 [paras[1], 0] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 38 [paras[1], 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 39 [paras[1], 1] assert_equals: focusNode must be the node passed to extend() expected Element node <p id="b" style="display:none">Ijklmnop
-</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 39 [paras[1], 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 40 [paras[1], 2] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 40 [paras[1], 2] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 41 [detachedPara1, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 41 [detachedPara1, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 42 [detachedPara1, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Element node <p>Opqrstuv</p> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 42 [detachedPara1, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 43 [testDiv, 0] assert_equals: focusNode must be the node passed to extend() 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 extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 43 [testDiv, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 44 [testDiv, 3] assert_equals: focusNode must be the node passed to extend() expected Element node <div id="test"><p id="a">Äb̈c̈d̈ëf̈g̈ḧ
-</p><p id="b" s... but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 44 [testDiv, 3] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 45 [document, -1] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 45 [document, -1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 46 [document, 0] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 46 [document, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 47 [document, 1] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Äb̈c̈d̈ëf̈g̈ḧ
-"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 47 [document, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 48 [document, 2] assert_equals: focusNode must be the node passed to extend() expected Document node with 2 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 48 [document, 2] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 49 [document, 3] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 49 [document, 3] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 50 [comment, -1] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 50 [comment, -1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 51 [comment, 0] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 51 [comment, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 52 [comment, 4] assert_equals: focusNode must be the node passed to extend() expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 52 [comment, 4] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 53 [comment, 96] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 53 [comment, 96] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 54 [foreignDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 54 [foreignDoc, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 55 [foreignDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 3 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 55 [foreignDoc, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 56 [foreignComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--"Commenter" and "commentator" mean different things.  I'v...--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 56 [foreignComment, 2] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 57 [foreignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 57 [foreignTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 58 [foreignTextNode, 36] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "I admit that I harbor doubts about whether we really need..." but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 58 [foreignTextNode, 36] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 59 [xmlDoc, -1] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 59 [xmlDoc, -1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 60 [xmlDoc, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 60 [xmlDoc, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 61 [xmlDoc, 1] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Document node with 4 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 61 [xmlDoc, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 62 [xmlDoc, 5] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 62 [xmlDoc, 5] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 63 [xmlComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 63 [xmlComment, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 64 [xmlComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--I maliciously created a comment that will break incautiou...--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 64 [xmlComment, 4] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 65 [processingInstruction, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 65 [processingInstruction, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 66 [processingInstruction, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 66 [processingInstruction, 5] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 67 [processingInstruction, 9] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "somePI" and data "Did you know that \":syn sync fromstart\" is very useful wh..." but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 67 [processingInstruction, 9] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 68 [detachedTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 68 [detachedTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 69 [detachedTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Uvwxyzab" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 69 [detachedTextNode, 8] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 70 [detachedForeignTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Cdefghij" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 71 [detachedForeignTextNode, 8] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 72 [detachedXmlTextNode, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Text node "Klmnopqr" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 73 [detachedXmlTextNode, 8] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected ProcessingInstruction node with target "whippoorwill" and data "chirp chirp chirp" but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 74 [detachedProcessingInstruction, 12] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 75 [detachedComment, 3] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 75 [detachedComment, 3] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 76 [detachedComment, 5] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--Stuvwxyz--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 76 [detachedComment, 5] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 77 [detachedForeignComment, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 77 [detachedForeignComment, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 78 [detachedForeignComment, 4] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--אריה יהודה--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 78 [detachedForeignComment, 4] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 79 [detachedXmlComment, 2] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected Comment node <!--בן חיים אליעזר--> but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 79 [detachedXmlComment, 2] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 80 [docfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 80 [docfrag, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 81 [foreignDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 81 [foreignDocfrag, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 82 [xmlDocfrag, 0] assert_equals: anchorNode must be the node passed to extend() if it has a different root from the original range expected DocumentFragment node with 0 children but got Text node "Qrstuvwx"
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 82 [xmlDocfrag, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 83 [doctype, 0] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 83 [doctype, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-FAIL extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 84 [doctype, -17] assert_throws: extend() to a doctype must throw InvalidNodeTypeError function "function () {
-            selection.extend(node, offset);
-        }" threw object "IndexSizeError: Failed to execute 'extend' on 'Selection': -17 is not a valid offset." that is not a DOMException INVALID_NODE_TYPE_ERR: property "code" is equal to 1, expected 24
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 84 [doctype, -17] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 85 [doctype, 1] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 85 [doctype, 1] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 86 [foreignDoctype, 0] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 86 [foreignDoctype, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-PASS extend() forwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 87 [xmlDoctype, 0] 
-FAIL extend() backwards with range 39 [paras[2].firstChild, 4, comment, 2] and point 87 [xmlDoctype, 0] assert_equals: Sanity check: endContainer must be correct expected Comment node <!--Alphabet soup?--> but got Text node "Qrstuvwx"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValueFuzzer.cpp b/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValueFuzzer.cpp
index 9e61550..ce5c386 100644
--- a/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValueFuzzer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/serialization/SerializedScriptValueFuzzer.cpp
@@ -37,8 +37,7 @@
  public:
   // WebMessagePortChannel
   void setClient(WebMessagePortChannelClient* client) override {}
-  void destroy() override { delete this; }
-  void postMessage(const WebString&, WebMessagePortChannelArray*) {
+  void postMessage(const WebString&, WebMessagePortChannelArray) {
     NOTIMPLEMENTED();
   }
   bool tryGetMessage(WebString*, WebMessagePortChannelArray&) { return false; }
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializerTest.cpp b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializerTest.cpp
index c9414d97..285f31b 100644
--- a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializerTest.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializerTest.cpp
@@ -63,7 +63,7 @@
                                        : scope.getExceptionState();
 
   // Extract message ports and disentangle them.
-  std::unique_ptr<MessagePortChannelArray> channels;
+  MessagePortChannelArray channels;
   if (transferables) {
     channels = MessagePort::disentanglePorts(scope.getExecutionContext(),
                                              transferables->messagePorts,
@@ -239,8 +239,7 @@
  public:
   // WebMessagePortChannel
   void setClient(WebMessagePortChannelClient* client) override {}
-  void destroy() override { delete this; }
-  void postMessage(const WebString&, WebMessagePortChannelArray*) {
+  void postMessage(const WebString&, WebMessagePortChannelArray) {
     NOTIMPLEMENTED();
   }
   bool tryGetMessage(WebString*, WebMessagePortChannelArray&) { return false; }
diff --git a/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl
index 45438ee..a1be921 100644
--- a/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/attributes.cpp.tmpl
@@ -507,8 +507,6 @@
 
 {##############################################################################}
 {% macro install_conditionally_enabled_attributes_on_prototype() %}
-ExecutionContext* executionContext = toExecutionContext(context);
-v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
 {% for attribute in attributes if (attribute.exposed_test or attribute.secure_context_test) and attribute.on_prototype %}
 {% filter exposed(attribute.exposed_test) %}
 {% filter secure_context(attribute.secure_context_test) %}
diff --git a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
index 57ab4ac..439615c 100644
--- a/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/interface_base.cpp.tmpl
@@ -714,7 +714,13 @@
   {% if is_partial %}
   {{v8_class}}::preparePrototypeAndInterfaceObject(context, world, prototypeObject, interfaceObject, interfaceTemplate);
   {% endif %}
+
   v8::Isolate* isolate = context->GetIsolate();
+  {% if has_conditional_attributes_on_prototype or methods | conditionally_exposed(is_partial) %}
+  v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
+  ExecutionContext* executionContext = toExecutionContext(context);
+  DCHECK(executionContext);
+  {% endif %}
 
 {% if unscopables %}
   v8::Local<v8::Name> unscopablesSymbol(v8::Symbol::GetUnscopables(isolate));
diff --git a/third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl b/third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl
index 2dbda141..266b360b 100644
--- a/third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl
+++ b/third_party/WebKit/Source/bindings/templates/methods.cpp.tmpl
@@ -643,10 +643,6 @@
 {######################################}
 {% macro install_conditionally_enabled_methods() %}
 {% if methods | conditionally_exposed(is_partial) %}
-{# Define operations with limited exposure #}
-v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
-ExecutionContext* executionContext = toExecutionContext(prototypeObject->CreationContext());
-DCHECK(executionContext);
 {% for method in methods | conditionally_exposed(is_partial) %}
 {% filter secure_context(method.overloads.secure_context_test_all
                          if method.overloads else
diff --git a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartial.idl b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartial.idl
index 6ed38cd..dcabd38 100644
--- a/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartial.idl
+++ b/third_party/WebKit/Source/bindings/tests/idls/core/TestInterfacePartial.idl
@@ -53,4 +53,6 @@
 
     attribute PartialEnumType partialPartialEnumTypeAttribute;
     void partialVoidMethodPartialCallbackTypeArg(PartialCallbackType partialCallbackTypeArg);
+
+    [SecureContext] attribute long partialSecureContextLongAttribute;
 };
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
index 3ef5e5e1..389ede3 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.cpp
@@ -885,6 +885,28 @@
   TestInterfacePartial::setPartialPartialEnumTypeAttribute(*impl, cppValue);
 }
 
+static void partialSecureContextLongAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info) {
+  v8::Local<v8::Object> holder = info.Holder();
+
+  TestInterfaceImplementation* impl = V8TestInterface::toImpl(holder);
+
+  v8SetReturnValueInt(info, TestInterfacePartial::partialSecureContextLongAttribute(*impl));
+}
+
+static void partialSecureContextLongAttributeAttributeSetter(v8::Local<v8::Value> v8Value, const v8::FunctionCallbackInfo<v8::Value>& info) {
+  v8::Local<v8::Object> holder = info.Holder();
+  TestInterfaceImplementation* impl = V8TestInterface::toImpl(holder);
+
+  ExceptionState exceptionState(info.GetIsolate(), ExceptionState::SetterContext, "TestInterface", "partialSecureContextLongAttribute");
+
+  // Prepare the value to be set.
+  int cppValue = toInt32(info.GetIsolate(), v8Value, NormalConversion, exceptionState);
+  if (exceptionState.hadException())
+    return;
+
+  TestInterfacePartial::setPartialSecureContextLongAttribute(*impl, cppValue);
+}
+
 static void partial2LongAttributeAttributeGetter(const v8::FunctionCallbackInfo<v8::Value>& info) {
   v8::Local<v8::Object> holder = info.Holder();
 
@@ -2221,6 +2243,16 @@
   TestInterfaceImplementationV8Internal::partialPartialEnumTypeAttributeAttributeSetter(v8Value, info);
 }
 
+void V8TestInterface::partialSecureContextLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+  TestInterfaceImplementationV8Internal::partialSecureContextLongAttributeAttributeGetter(info);
+}
+
+void V8TestInterface::partialSecureContextLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
+  v8::Local<v8::Value> v8Value = info[0];
+
+  TestInterfaceImplementationV8Internal::partialSecureContextLongAttributeAttributeSetter(v8Value, info);
+}
+
 void V8TestInterface::partial2LongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>& info) {
   TestInterfaceImplementationV8Internal::partial2LongAttributeAttributeGetter(info);
 }
@@ -2755,9 +2787,10 @@
 
 void V8TestInterface::preparePrototypeAndInterfaceObject(v8::Local<v8::Context> context, const DOMWrapperWorld& world, v8::Local<v8::Object> prototypeObject, v8::Local<v8::Function> interfaceObject, v8::Local<v8::FunctionTemplate> interfaceTemplate) {
   v8::Isolate* isolate = context->GetIsolate();
-
-  ExecutionContext* executionContext = toExecutionContext(context);
   v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
+  ExecutionContext* executionContext = toExecutionContext(context);
+  DCHECK(executionContext);
+
   if (executionContext && (executionContext->isWorkerGlobalScope())) {
     const V8DOMConfiguration::AccessorConfiguration accessorConfiguration = {"workerExposedAttribute", V8TestInterface::workerExposedAttributeAttributeGetterCallback, V8TestInterface::workerExposedAttributeAttributeSetterCallback, nullptr, nullptr, nullptr, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::OnPrototype, V8DOMConfiguration::CheckHolder};
     V8DOMConfiguration::installAccessor(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessorConfiguration);
@@ -2805,6 +2838,12 @@
     }
   }
   if (executionContext && (executionContext->isSecureContext())) {
+    if (RuntimeEnabledFeatures::partialFeatureNameEnabled()) {
+      const V8DOMConfiguration::AccessorConfiguration accessorConfiguration = {"partialSecureContextLongAttribute", V8TestInterface::partialSecureContextLongAttributeAttributeGetterCallback, V8TestInterface::partialSecureContextLongAttributeAttributeSetterCallback, nullptr, nullptr, nullptr, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::OnPrototype, V8DOMConfiguration::CheckHolder};
+      V8DOMConfiguration::installAccessor(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessorConfiguration);
+    }
+  }
+  if (executionContext && (executionContext->isSecureContext())) {
     const V8DOMConfiguration::AccessorConfiguration accessorConfiguration = {"partial2SecureContextAttribute", V8TestInterface::partial2SecureContextAttributeAttributeGetterCallback, V8TestInterface::partial2SecureContextAttributeAttributeSetterCallback, nullptr, nullptr, nullptr, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::OnPrototype, V8DOMConfiguration::CheckHolder};
     V8DOMConfiguration::installAccessor(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessorConfiguration);
   }
@@ -2846,9 +2885,6 @@
       }
     }
   }
-  v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
-  ExecutionContext* executionContext = toExecutionContext(prototypeObject->CreationContext());
-  DCHECK(executionContext);
   if (executionContext && (executionContext->isWorkerGlobalScope())) {
     const V8DOMConfiguration::MethodConfiguration workerExposedMethodMethodConfiguration = {"workerExposedMethod", V8TestInterface::workerExposedMethodMethodCallback, nullptr, 0, v8::None, V8DOMConfiguration::OnPrototype, V8DOMConfiguration::CheckHolder};
     V8DOMConfiguration::installMethod(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, workerExposedMethodMethodConfiguration);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h
index 0b6b320c..b3c3560 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterface.h
@@ -132,6 +132,8 @@
   CORE_EXPORT static void partialCallWithExecutionContextLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void partialPartialEnumTypeAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void partialPartialEnumTypeAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
+  CORE_EXPORT static void partialSecureContextLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
+  CORE_EXPORT static void partialSecureContextLongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void partial2LongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void partial2LongAttributeAttributeSetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
   CORE_EXPORT static void partial2StaticLongAttributeAttributeGetterCallback(const v8::FunctionCallbackInfo<v8::Value>&);
diff --git a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp
index 803358b..766022eb 100644
--- a/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/core/V8TestInterfaceSecureContext.cpp
@@ -362,9 +362,10 @@
 
 void V8TestInterfaceSecureContext::preparePrototypeAndInterfaceObject(v8::Local<v8::Context> context, const DOMWrapperWorld& world, v8::Local<v8::Object> prototypeObject, v8::Local<v8::Function> interfaceObject, v8::Local<v8::FunctionTemplate> interfaceTemplate) {
   v8::Isolate* isolate = context->GetIsolate();
-
-  ExecutionContext* executionContext = toExecutionContext(context);
   v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
+  ExecutionContext* executionContext = toExecutionContext(context);
+  DCHECK(executionContext);
+
   if (executionContext && (executionContext->isSecureContext())) {
     const V8DOMConfiguration::AccessorConfiguration accessorConfiguration = {"secureContextAttribute", V8TestInterfaceSecureContext::secureContextAttributeAttributeGetterCallback, V8TestInterfaceSecureContext::secureContextAttributeAttributeSetterCallback, nullptr, nullptr, nullptr, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::OnPrototype, V8DOMConfiguration::CheckHolder};
     V8DOMConfiguration::installAccessor(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessorConfiguration);
@@ -403,9 +404,6 @@
       }
     }
   }
-  v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
-  ExecutionContext* executionContext = toExecutionContext(prototypeObject->CreationContext());
-  DCHECK(executionContext);
   if (executionContext && (executionContext->isSecureContext())) {
     const V8DOMConfiguration::MethodConfiguration secureContextMethodMethodConfiguration = {"secureContextMethod", V8TestInterfaceSecureContext::secureContextMethodMethodCallback, nullptr, 0, v8::None, V8DOMConfiguration::OnPrototype, V8DOMConfiguration::CheckHolder};
     V8DOMConfiguration::installMethod(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, secureContextMethodMethodConfiguration);
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
index 3275bda..815c035 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterface5.cpp
@@ -851,9 +851,10 @@
 
 void V8TestInterface5::preparePrototypeAndInterfaceObject(v8::Local<v8::Context> context, const DOMWrapperWorld& world, v8::Local<v8::Object> prototypeObject, v8::Local<v8::Function> interfaceObject, v8::Local<v8::FunctionTemplate> interfaceTemplate) {
   v8::Isolate* isolate = context->GetIsolate();
-
-  ExecutionContext* executionContext = toExecutionContext(context);
   v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
+  ExecutionContext* executionContext = toExecutionContext(context);
+  DCHECK(executionContext);
+
   if (executionContext && (executionContext->isWorkerGlobalScope())) {
     const V8DOMConfiguration::AccessorConfiguration accessorConfiguration = {"workerExposedAttribute", V8TestInterface5::workerExposedAttributeAttributeGetterCallback, V8TestInterface5::workerExposedAttributeAttributeSetterCallback, nullptr, nullptr, nullptr, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::OnPrototype, V8DOMConfiguration::CheckHolder};
     V8DOMConfiguration::installAccessor(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessorConfiguration);
@@ -862,9 +863,6 @@
     const V8DOMConfiguration::AccessorConfiguration accessorConfiguration = {"windowExposedAttribute", V8TestInterface5::windowExposedAttributeAttributeGetterCallback, V8TestInterface5::windowExposedAttributeAttributeSetterCallback, nullptr, nullptr, nullptr, nullptr, static_cast<v8::PropertyAttribute>(v8::None), V8DOMConfiguration::OnPrototype, V8DOMConfiguration::CheckHolder};
     V8DOMConfiguration::installAccessor(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, accessorConfiguration);
   }
-  v8::Local<v8::Signature> signature = v8::Signature::New(isolate, interfaceTemplate);
-  ExecutionContext* executionContext = toExecutionContext(prototypeObject->CreationContext());
-  DCHECK(executionContext);
   if (executionContext && (executionContext->isWorkerGlobalScope())) {
     const V8DOMConfiguration::MethodConfiguration workerExposedMethodMethodConfiguration = {"workerExposedMethod", V8TestInterface5::workerExposedMethodMethodCallback, nullptr, 0, v8::None, V8DOMConfiguration::OnPrototype, V8DOMConfiguration::CheckHolder};
     V8DOMConfiguration::installMethod(isolate, world, v8::Local<v8::Object>(), prototypeObject, interfaceObject, signature, workerExposedMethodMethodConfiguration);
diff --git a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
index d90f42e..15ca3a7b 100644
--- a/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
+++ b/third_party/WebKit/Source/bindings/tests/results/modules/V8TestInterfacePartial.cpp
@@ -432,6 +432,7 @@
 
 void V8TestInterfacePartial::preparePrototypeAndInterfaceObject(v8::Local<v8::Context> context, const DOMWrapperWorld& world, v8::Local<v8::Object> prototypeObject, v8::Local<v8::Function> interfaceObject, v8::Local<v8::FunctionTemplate> interfaceTemplate) {
   V8TestInterface::preparePrototypeAndInterfaceObject(context, world, prototypeObject, interfaceObject, interfaceTemplate);
+
   v8::Isolate* isolate = context->GetIsolate();
 
   v8::Local<v8::Name> unscopablesSymbol(v8::Symbol::GetUnscopables(isolate));
diff --git a/third_party/WebKit/Source/core/dom/MessagePort.cpp b/third_party/WebKit/Source/core/dom/MessagePort.cpp
index 136192f..99d3222bc31 100644
--- a/third_party/WebKit/Source/core/dom/MessagePort.cpp
+++ b/third_party/WebKit/Source/core/dom/MessagePort.cpp
@@ -76,40 +76,34 @@
       return;
     }
   }
-  std::unique_ptr<MessagePortChannelArray> channels =
+  MessagePortChannelArray channels =
       MessagePort::disentanglePorts(scriptState->getExecutionContext(), ports,
                                     exceptionState);
   if (exceptionState.hadException())
     return;
 
   WebString messageString = message->toWireString();
-  std::unique_ptr<WebMessagePortChannelArray> webChannels =
+  WebMessagePortChannelArray webChannels =
       toWebMessagePortChannelArray(std::move(channels));
-  m_entangledChannel->postMessage(messageString, webChannels.release());
+  m_entangledChannel->postMessage(messageString, std::move(webChannels));
 }
 
 // static
-std::unique_ptr<WebMessagePortChannelArray>
-MessagePort::toWebMessagePortChannelArray(
-    std::unique_ptr<MessagePortChannelArray> channels) {
-  std::unique_ptr<WebMessagePortChannelArray> webChannels;
-  if (channels && channels->size()) {
-    webChannels =
-        WTF::wrapUnique(new WebMessagePortChannelArray(channels->size()));
-    for (size_t i = 0; i < channels->size(); ++i)
-      (*webChannels)[i] = (*channels)[i].release();
-  }
+WebMessagePortChannelArray MessagePort::toWebMessagePortChannelArray(
+    MessagePortChannelArray channels) {
+  WebMessagePortChannelArray webChannels(channels.size());
+  for (size_t i = 0; i < channels.size(); ++i)
+    webChannels[i] = std::move(channels[i]);
   return webChannels;
 }
 
 // static
 MessagePortArray* MessagePort::toMessagePortArray(
     ExecutionContext* context,
-    const WebMessagePortChannelArray& webChannels) {
-  std::unique_ptr<MessagePortChannelArray> channels =
-      WTF::wrapUnique(new MessagePortChannelArray(webChannels.size()));
+    WebMessagePortChannelArray webChannels) {
+  MessagePortChannelArray channels(webChannels.size());
   for (size_t i = 0; i < webChannels.size(); ++i)
-    (*channels)[i] = WebMessagePortChannelUniquePtr(webChannels[i]);
+    channels[i] = std::move(webChannels[i]);
   return MessagePort::entanglePorts(*context, std::move(channels));
 }
 
@@ -165,27 +159,25 @@
   return EventTargetNames::MessagePort;
 }
 
-static bool tryGetMessageFrom(
-    WebMessagePortChannel& webChannel,
-    RefPtr<SerializedScriptValue>& message,
-    std::unique_ptr<MessagePortChannelArray>& channels) {
+static bool tryGetMessageFrom(WebMessagePortChannel& webChannel,
+                              RefPtr<SerializedScriptValue>& message,
+                              MessagePortChannelArray& channels) {
   WebString messageString;
   WebMessagePortChannelArray webChannels;
   if (!webChannel.tryGetMessage(&messageString, webChannels))
     return false;
 
   if (webChannels.size()) {
-    channels = WTF::wrapUnique(new MessagePortChannelArray(webChannels.size()));
+    channels.resize(webChannels.size());
     for (size_t i = 0; i < webChannels.size(); ++i)
-      (*channels)[i] = WebMessagePortChannelUniquePtr(webChannels[i]);
+      channels[i] = std::move(webChannels[i]);
   }
   message = SerializedScriptValue::create(messageString);
   return true;
 }
 
-bool MessagePort::tryGetMessage(
-    RefPtr<SerializedScriptValue>& message,
-    std::unique_ptr<MessagePortChannelArray>& channels) {
+bool MessagePort::tryGetMessage(RefPtr<SerializedScriptValue>& message,
+                                MessagePortChannelArray& channels) {
   if (!m_entangledChannel)
     return false;
   return tryGetMessageFrom(*m_entangledChannel, message, channels);
@@ -214,7 +206,7 @@
     }
 
     RefPtr<SerializedScriptValue> message;
-    std::unique_ptr<MessagePortChannelArray> channels;
+    MessagePortChannelArray channels;
     if (!tryGetMessage(message, channels))
       break;
 
@@ -235,12 +227,12 @@
   return m_started && isEntangled();
 }
 
-std::unique_ptr<MessagePortChannelArray> MessagePort::disentanglePorts(
+MessagePortChannelArray MessagePort::disentanglePorts(
     ExecutionContext* context,
     const MessagePortArray& ports,
     ExceptionState& exceptionState) {
   if (!ports.size())
-    return nullptr;
+    return MessagePortChannelArray();
 
   HeapHashSet<Member<MessagePort>> visited;
 
@@ -259,7 +251,7 @@
       exceptionState.throwDOMException(
           DataCloneError,
           "Port at index " + String::number(i) + " is " + type + ".");
-      return nullptr;
+      return MessagePortChannelArray();
     }
     visited.insert(port);
   }
@@ -267,25 +259,20 @@
   UseCounter::count(context, UseCounter::MessagePortsTransferred);
 
   // Passed-in ports passed validity checks, so we can disentangle them.
-  std::unique_ptr<MessagePortChannelArray> portArray =
-      WTF::wrapUnique(new MessagePortChannelArray(ports.size()));
+  MessagePortChannelArray portArray(ports.size());
   for (unsigned i = 0; i < ports.size(); ++i)
-    (*portArray)[i] = ports[i]->disentangle();
+    portArray[i] = ports[i]->disentangle();
   return portArray;
 }
 
-MessagePortArray* MessagePort::entanglePorts(
-    ExecutionContext& context,
-    std::unique_ptr<MessagePortChannelArray> channels) {
+MessagePortArray* MessagePort::entanglePorts(ExecutionContext& context,
+                                             MessagePortChannelArray channels) {
   // https://html.spec.whatwg.org/multipage/comms.html#message-ports
   // |ports| should be an empty array, not null even when there is no ports.
-  if (!channels || !channels->size())
-    return new MessagePortArray;
-
-  MessagePortArray* portArray = new MessagePortArray(channels->size());
-  for (unsigned i = 0; i < channels->size(); ++i) {
+  MessagePortArray* portArray = new MessagePortArray(channels.size());
+  for (unsigned i = 0; i < channels.size(); ++i) {
     MessagePort* port = MessagePort::create(context);
-    port->entangle(std::move((*channels)[i]));
+    port->entangle(std::move(channels[i]));
     (*portArray)[i] = port;
   }
   return portArray;
diff --git a/third_party/WebKit/Source/core/dom/MessagePort.h b/third_party/WebKit/Source/core/dom/MessagePort.h
index af79d45..1668f74 100644
--- a/third_party/WebKit/Source/core/dom/MessagePort.h
+++ b/third_party/WebKit/Source/core/dom/MessagePort.h
@@ -75,24 +75,22 @@
   void entangle(WebMessagePortChannelUniquePtr);
   WebMessagePortChannelUniquePtr disentangle();
 
-  // Returns nullptr if the passed-in array is nullptr/empty.
-  static std::unique_ptr<WebMessagePortChannelArray>
-      toWebMessagePortChannelArray(std::unique_ptr<MessagePortChannelArray>);
+  static WebMessagePortChannelArray toWebMessagePortChannelArray(
+      MessagePortChannelArray);
 
   // Returns an empty array if the passed array is empty.
-  static MessagePortArray* toMessagePortArray(
-      ExecutionContext*,
-      const WebMessagePortChannelArray&);
+  static MessagePortArray* toMessagePortArray(ExecutionContext*,
+                                              WebMessagePortChannelArray);
 
-  // Returns nullptr if there is an exception, or if the passed-in array is
+  // Returns an empty array if there is an exception, or if the passed array is
   // nullptr/empty.
-  static std::unique_ptr<MessagePortChannelArray>
-  disentanglePorts(ExecutionContext*, const MessagePortArray&, ExceptionState&);
+  static MessagePortChannelArray disentanglePorts(ExecutionContext*,
+                                                  const MessagePortArray&,
+                                                  ExceptionState&);
 
-  // Returns an empty array if the passed array is nullptr/empty.
-  static MessagePortArray* entanglePorts(
-      ExecutionContext&,
-      std::unique_ptr<MessagePortChannelArray>);
+  // Returns an empty array if the passed array is empty.
+  static MessagePortArray* entanglePorts(ExecutionContext&,
+                                         MessagePortChannelArray);
 
   bool started() const { return m_started; }
 
@@ -134,7 +132,7 @@
  protected:
   explicit MessagePort(ExecutionContext&);
   bool tryGetMessage(RefPtr<SerializedScriptValue>& message,
-                     std::unique_ptr<MessagePortChannelArray>& channels);
+                     MessagePortChannelArray& channels);
 
  private:
   // WebMessagePortChannelClient implementation.
diff --git a/third_party/WebKit/Source/core/editing/DOMSelection.cpp b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
index da74aa29..8d1a247 100644
--- a/third_party/WebKit/Source/core/editing/DOMSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/DOMSelection.cpp
@@ -81,6 +81,13 @@
   return selection.base() <= selection.extent();
 }
 
+const Position& DOMSelection::anchorPosition() const {
+  DCHECK(frame());
+  return frame()->selection().selectionInDOMTree().base();
+}
+
+// TODO(tkent): Following four functions based on VisibleSelection should be
+// removed.
 static Position anchorPosition(const VisibleSelection& selection) {
   Position anchor =
       selection.isBaseFirst() ? selection.start() : selection.end();
@@ -405,7 +412,10 @@
                           int offset,
                           ExceptionState& exceptionState) {
   DCHECK(node);
+  // https://www.w3.org/TR/selection-api/#dom-selection-extend
 
+  // 2. If the context object is empty, throw an InvalidStateError exception and
+  // abort these steps.
   if (rangeCount() == 0) {
     exceptionState.throwDOMException(
         InvalidStateError, "This Selection object doesn't have any Ranges.");
@@ -421,25 +431,51 @@
   if (exceptionState.hadException())
     return;
 
+  // 1. If node's root is not the document associated with the context object,
+  // abort these steps.
   if (!isValidForPosition(node))
     return;
 
+  // 3. Let oldAnchor and oldFocus be the context object's anchor and focus, and
+  // let newFocus be the boundary point (node, offset).
+  const Position& oldAnchor = anchorPosition();
+  DCHECK(!oldAnchor.isNull());
+  const Position newFocus(node, offset);
+
   clearCachedRangeIfSelectionOfDocument();
-  const Position& base = frame()->selection().base();
-  if (base.isNull()) {
-    // TODO(editing-dev): We should throw |InvalidStateError| if selection is
-    // none to follow the spec.
-    frame()->selection().setSelection(SelectionInDOMTree::Builder()
-                                          .collapse(Position(node, offset))
-                                          .setIsDirectional(true)
-                                          .build());
-    return;
+
+  // 4. Let newRange be a new range.
+  Range* newRange = Range::create(*frame()->document());
+
+  // 5. If node's root is not the same as the context object's range's root, set
+  // newRange's start and end to newFocus.
+  // E.g. oldAnchor might point in shadow Text node in TextControlElement.
+  if (oldAnchor.anchorNode()->treeRoot() != node->treeRoot()) {
+    newRange->setStart(node, offset);
+    newRange->setEnd(node, offset);
+
+  } else if (oldAnchor <= newFocus) {
+    // 6. Otherwise, if oldAnchor is before or equal to newFocus, set newRange's
+    // start to oldAnchor, then set its end to newFocus.
+    newRange->setStart(oldAnchor.anchorNode(),
+                       oldAnchor.offsetInContainerNode());
+    newRange->setEnd(node, offset);
+
+  } else {
+    // 7. Otherwise, set newRange's start to newFocus, then set its end to
+    // oldAnchor.
+    newRange->setStart(node, offset);
+    newRange->setEnd(oldAnchor.anchorNode(), oldAnchor.offsetInContainerNode());
   }
-  frame()->selection().setSelection(SelectionInDOMTree::Builder()
-                                        .collapse(base)
-                                        .extend(Position(node, offset))
-                                        .setIsDirectional(true)
-                                        .build());
+
+  // 8. Set the context object's range to newRange.
+  SelectionInDOMTree::Builder builder;
+  if (newRange->collapsed())
+    builder.collapse(newFocus);
+  else
+    builder.collapse(oldAnchor).extend(newFocus);
+  frame()->selection().setSelection(builder.setIsDirectional(true).build());
+  cacheRangeIfSelectionOfDocument(newRange);
 }
 
 Range* DOMSelection::getRangeAt(int index,
@@ -469,7 +505,7 @@
 }
 
 Range* DOMSelection::createRangeFromSelectionEditor() const {
-  Position anchor = anchorPosition(visibleSelection());
+  Position anchor = blink::anchorPosition(visibleSelection());
   if (isSelectionOfDocument() && !anchor.anchorNode()->isInShadowTree())
     return frame()->selection().firstRange();
 
diff --git a/third_party/WebKit/Source/core/editing/DOMSelection.h b/third_party/WebKit/Source/core/editing/DOMSelection.h
index b983c87..25b3257 100644
--- a/third_party/WebKit/Source/core/editing/DOMSelection.h
+++ b/third_party/WebKit/Source/core/editing/DOMSelection.h
@@ -111,6 +111,7 @@
   // Convenience methods for accessors, does not check m_frame present.
   const VisibleSelection& visibleSelection() const;
   bool isBaseFirstInSelection() const;
+  const Position& anchorPosition() const;
 
   Node* shadowAdjustedNode(const Position&) const;
   int shadowAdjustedOffset(const Position&) const;
diff --git a/third_party/WebKit/Source/core/events/MessageEvent.cpp b/third_party/WebKit/Source/core/events/MessageEvent.cpp
index 97ca6f65..d5cc6305 100644
--- a/third_party/WebKit/Source/core/events/MessageEvent.cpp
+++ b/third_party/WebKit/Source/core/events/MessageEvent.cpp
@@ -97,7 +97,7 @@
                            const String& origin,
                            const String& lastEventId,
                            EventTarget* source,
-                           std::unique_ptr<MessagePortChannelArray> channels,
+                           MessagePortChannelArray channels,
                            const String& suborigin)
     : Event(EventTypeNames::message, false, false),
       m_dataType(DataTypeSerializedScriptValue),
diff --git a/third_party/WebKit/Source/core/events/MessageEvent.h b/third_party/WebKit/Source/core/events/MessageEvent.h
index f497a484..836e8142 100644
--- a/third_party/WebKit/Source/core/events/MessageEvent.h
+++ b/third_party/WebKit/Source/core/events/MessageEvent.h
@@ -63,7 +63,7 @@
     return new MessageEvent(std::move(data), origin, lastEventId, source, ports,
                             suborigin);
   }
-  static MessageEvent* create(std::unique_ptr<MessagePortChannelArray> channels,
+  static MessageEvent* create(MessagePortChannelArray channels,
                               PassRefPtr<SerializedScriptValue> data,
                               const String& origin = String(),
                               const String& lastEventId = String(),
@@ -123,9 +123,8 @@
   EventTarget* source() const { return m_source.get(); }
   MessagePortArray ports(bool& isNull) const;
   MessagePortArray ports() const;
-  MessagePortChannelArray* channels() const {
-    return m_channels ? m_channels.get() : nullptr;
-  }
+
+  MessagePortChannelArray releaseChannels() { return std::move(m_channels); }
 
   const AtomicString& interfaceName() const override;
 
@@ -190,7 +189,7 @@
                const String& origin,
                const String& lastEventId,
                EventTarget* source,
-               std::unique_ptr<MessagePortChannelArray>,
+               MessagePortChannelArray,
                const String& suborigin);
 
   MessageEvent(const String& data,
@@ -210,11 +209,11 @@
   String m_origin;
   String m_lastEventId;
   Member<EventTarget> m_source;
-  // m_ports are the MessagePorts in an engtangled state, and m_channels are
+  // m_ports are the MessagePorts in an entangled state, and m_channels are
   // the MessageChannels in a disentangled state. Only one of them can be
   // non-empty at a time. entangleMessagePorts() moves between the states.
   Member<MessagePortArray> m_ports;
-  std::unique_ptr<MessagePortChannelArray> m_channels;
+  MessagePortChannelArray m_channels;
   String m_suborigin;
 };
 
diff --git a/third_party/WebKit/Source/core/frame/DOMWindow.cpp b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
index 6a8dfce8..3d6ecea 100644
--- a/third_party/WebKit/Source/core/frame/DOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/DOMWindow.cpp
@@ -185,9 +185,8 @@
     }
   }
 
-  std::unique_ptr<MessagePortChannelArray> channels =
-      MessagePort::disentanglePorts(getExecutionContext(), ports,
-                                    exceptionState);
+  MessagePortChannelArray channels = MessagePort::disentanglePorts(
+      getExecutionContext(), ports, exceptionState);
   if (exceptionState.hadException())
     return;
 
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTRegion.cpp b/third_party/WebKit/Source/core/html/track/vtt/VTTRegion.cpp
index bf9b0ad..68ba34c 100644
--- a/third_party/WebKit/Source/core/html/track/vtt/VTTRegion.cpp
+++ b/third_party/WebKit/Source/core/html/track/vtt/VTTRegion.cpp
@@ -39,6 +39,7 @@
 #include "core/html/HTMLDivElement.h"
 #include "core/html/track/vtt/VTTParser.h"
 #include "core/html/track/vtt/VTTScanner.h"
+#include "public/platform/Platform.h"
 #include "wtf/MathExtras.h"
 
 #define VTT_LOG_LEVEL 3
@@ -90,7 +91,9 @@
       m_viewportAnchor(FloatPoint(defaultAnchorPointX, defaultAnchorPointY)),
       m_scroll(defaultScroll),
       m_currentTop(0),
-      m_scrollTimer(this, &VTTRegion::scrollTimerFired) {}
+      m_scrollTimer(Platform::current()->currentThread()->getWebTaskRunner(),
+                    this,
+                    &VTTRegion::scrollTimerFired) {}
 
 VTTRegion::~VTTRegion() {}
 
diff --git a/third_party/WebKit/Source/core/html/track/vtt/VTTRegion.h b/third_party/WebKit/Source/core/html/track/vtt/VTTRegion.h
index 8c422b7..2c2ee639 100644
--- a/third_party/WebKit/Source/core/html/track/vtt/VTTRegion.h
+++ b/third_party/WebKit/Source/core/html/track/vtt/VTTRegion.h
@@ -134,7 +134,7 @@
   // soon as the animation for rolling out one line has finished, but
   // currently it is used also for non-scrolling regions to use a single
   // code path.
-  Timer<VTTRegion> m_scrollTimer;
+  TaskRunnerTimer<VTTRegion> m_scrollTimer;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
index fca4c5fd..2b869f79 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
@@ -41,6 +41,7 @@
 #include "core/style/ShadowList.h"
 #include "platform/LengthFunctions.h"
 #include "platform/geometry/TransformState.h"
+#include "platform/scroll/MainThreadScrollingReason.h"
 #include "wtf/PtrUtil.h"
 
 namespace blink {
@@ -111,7 +112,8 @@
          layer()->getScrollableArea()->usesCompositedScrolling();
 }
 
-BackgroundPaintLocation LayoutBoxModelObject::backgroundPaintLocation() const {
+BackgroundPaintLocation LayoutBoxModelObject::backgroundPaintLocation(
+    uint32_t* reasons) const {
   bool hasCustomScrollbars = false;
   // TODO(flackr): Detect opaque custom scrollbars which would cover up a
   // border-box background.
@@ -132,8 +134,11 @@
   // TODO(flackr): Remove this when box shadows are still painted correctly when
   // painting into the composited scrolling contents layer.
   // https://crbug.com/646464
-  if (style()->boxShadow())
+  if (style()->boxShadow()) {
+    if (reasons)
+      *reasons |= MainThreadScrollingReason::kHasBoxShadowFromNonRootLayer;
     return BackgroundPaintInGraphicsLayer;
+  }
 
   // Assume optimistically that the background can be painted in the scrolling
   // contents until we find otherwise.
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
index c84f2b2e..e082ada 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.h
@@ -197,7 +197,7 @@
 
   // Returns which layers backgrounds should be painted into for overflow
   // scrolling boxes.
-  BackgroundPaintLocation backgroundPaintLocation() const;
+  BackgroundPaintLocation backgroundPaintLocation(uint32_t* reasons) const;
 
   // These return the CSS computed padding values.
   LayoutUnit computedCSSPaddingTop() const {
diff --git a/third_party/WebKit/Source/core/loader/MockThreadableLoader.h b/third_party/WebKit/Source/core/loader/MockThreadableLoader.h
deleted file mode 100644
index 27df19b..0000000
--- a/third_party/WebKit/Source/core/loader/MockThreadableLoader.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MockThreadableLoader_h
-#define MockThreadableLoader_h
-
-#include "core/loader/ThreadableLoader.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "wtf/PtrUtil.h"
-#include <memory>
-
-namespace blink {
-
-class MockThreadableLoader : public ThreadableLoader {
- public:
-  static MockThreadableLoader* create() {
-    return new testing::StrictMock<MockThreadableLoader>;
-  }
-
-  MOCK_METHOD1(start, void(const ResourceRequest&));
-  MOCK_METHOD1(overrideTimeout, void(unsigned long));
-  MOCK_METHOD0(cancel, void());
-
- protected:
-  MockThreadableLoader() = default;
-};
-
-}  // namespace blink
-
-#endif  // MockThreadableLoader_h
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
index 693e3f2..d58952d 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -2596,15 +2596,16 @@
   }
 }
 
-BackgroundPaintLocation PaintLayer::backgroundPaintLocation() const {
+BackgroundPaintLocation PaintLayer::backgroundPaintLocation(
+    uint32_t* reasons) const {
   BackgroundPaintLocation location;
   if (!scrollsOverflow()) {
     location = BackgroundPaintInGraphicsLayer;
   } else if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) {
-    location = layoutObject()->backgroundPaintLocation();
+    location = layoutObject()->backgroundPaintLocation(reasons);
   } else {
     location = isRootLayer() ? BackgroundPaintInGraphicsLayer
-                             : layoutObject()->backgroundPaintLocation();
+                             : layoutObject()->backgroundPaintLocation(reasons);
   }
   m_stackingNode->updateLayerListsIfNeeded();
   if (m_stackingNode->hasNegativeZOrderList())
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.h b/third_party/WebKit/Source/core/paint/PaintLayer.h
index 4a7719a..805f9d91 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayer.h
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.h
@@ -502,7 +502,12 @@
   // Returns nullptr if this PaintLayer is not composited.
   GraphicsLayer* graphicsLayerBacking(const LayoutObject* = nullptr) const;
 
-  BackgroundPaintLocation backgroundPaintLocation() const;
+  // TODO(yigu): PaintLayerScrollableArea::computeNeedsCompositedScrolling
+  // calls this method to obtain main thread scrolling reasons due to
+  // background paint location. Once the cases get handled on compositor the
+  // parameter "reasons" could be removed.
+  BackgroundPaintLocation backgroundPaintLocation(
+      uint32_t* reasons = nullptr) const;
   // NOTE: If you are using hasCompositedLayerMapping to determine the state of
   // compositing for this layer, (and not just to do bookkeeping related to the
   // mapping like, say, allocating or deallocating a mapping), then you may have
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
index 8f1d9ac..33358d38 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
@@ -1752,13 +1752,15 @@
     return false;
 
   bool needsCompositedScrolling = true;
+  uint32_t mainThreadScrollingReasons = 0;
 
   // TODO(flackr): Allow integer transforms as long as all of the ancestor
   // transforms are also integer.
   bool backgroundSupportsLCDText =
       RuntimeEnabledFeatures::compositeOpaqueScrollersEnabled() &&
       layer->layoutObject()->style()->isStackingContext() &&
-      layer->backgroundPaintLocation() & BackgroundPaintInScrollingContents &&
+      layer->backgroundPaintLocation(&mainThreadScrollingReasons) &
+          BackgroundPaintInScrollingContents &&
       layer->backgroundIsKnownToBeOpaqueInRect(
           toLayoutBox(layer->layoutObject())->paddingBoxRect()) &&
       !layer->compositesWithTransform() && !layer->compositesWithOpacity();
@@ -1767,18 +1769,19 @@
       !layer->compositor()->preferCompositingToLCDTextEnabled() &&
       !backgroundSupportsLCDText) {
     if (layer->compositesWithOpacity()) {
-      addStyleRelatedMainThreadScrollingReasons(
-          MainThreadScrollingReason::kHasOpacityAndLCDText);
+      mainThreadScrollingReasons |=
+          MainThreadScrollingReason::kHasOpacityAndLCDText;
     }
     if (layer->compositesWithTransform()) {
-      addStyleRelatedMainThreadScrollingReasons(
-          MainThreadScrollingReason::kHasTransformAndLCDText);
+      mainThreadScrollingReasons |=
+          MainThreadScrollingReason::kHasTransformAndLCDText;
     }
     if (!layer->backgroundIsKnownToBeOpaqueInRect(
             toLayoutBox(layer->layoutObject())->paddingBoxRect())) {
-      addStyleRelatedMainThreadScrollingReasons(
-          MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText);
+      mainThreadScrollingReasons |=
+          MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText;
     }
+
     needsCompositedScrolling = false;
   }
 
@@ -1787,21 +1790,25 @@
   // behind dashed borders). Resolve this case, or not, and update this check
   // with the results.
   if (layer->layoutObject()->style()->hasBorderRadius()) {
-    addStyleRelatedMainThreadScrollingReasons(
-        MainThreadScrollingReason::kHasBorderRadius);
+    mainThreadScrollingReasons |= MainThreadScrollingReason::kHasBorderRadius;
     needsCompositedScrolling = false;
   }
   if (layer->layoutObject()->hasClip() || layer->hasDescendantWithClipPath() ||
       layer->hasAncestorWithClipPath()) {
-    addStyleRelatedMainThreadScrollingReasons(
-        MainThreadScrollingReason::kHasClipRelatedProperty);
+    mainThreadScrollingReasons |=
+        MainThreadScrollingReason::kHasClipRelatedProperty;
     needsCompositedScrolling = false;
   }
+
+  if (mainThreadScrollingReasons) {
+    addStyleRelatedMainThreadScrollingReasons(mainThreadScrollingReasons);
+  }
+
   return needsCompositedScrolling;
 }
 
 void PaintLayerScrollableArea::addStyleRelatedMainThreadScrollingReasons(
-    const uint32_t reason) {
+    const uint32_t reasons) {
   LocalFrame* frame = box().frame();
   if (!frame)
     return;
@@ -1809,8 +1816,14 @@
   if (!frameView)
     return;
 
-  frameView->adjustStyleRelatedMainThreadScrollingReasons(reason, true);
-  m_reasons |= reason;
+  for (uint32_t reason = 1;
+       reason < 1 << MainThreadScrollingReason::kMainThreadScrollingReasonCount;
+       reason <<= 1) {
+    if (reasons & reason) {
+      frameView->adjustStyleRelatedMainThreadScrollingReasons(reason, true);
+      m_reasons |= reason;
+    }
+  }
 }
 
 void PaintLayerScrollableArea::removeStyleRelatedMainThreadScrollingReasons() {
diff --git a/third_party/WebKit/Source/core/workers/DedicatedWorkerGlobalScope.cpp b/third_party/WebKit/Source/core/workers/DedicatedWorkerGlobalScope.cpp
index 371b4e4..5fc0573 100644
--- a/third_party/WebKit/Source/core/workers/DedicatedWorkerGlobalScope.cpp
+++ b/third_party/WebKit/Source/core/workers/DedicatedWorkerGlobalScope.cpp
@@ -90,7 +90,7 @@
     const MessagePortArray& ports,
     ExceptionState& exceptionState) {
   // Disentangle the port in preparation for sending it to the remote context.
-  std::unique_ptr<MessagePortChannelArray> channels =
+  MessagePortChannelArray channels =
       MessagePort::disentanglePorts(scriptState->getExecutionContext(), ports,
                                     exceptionState);
   if (exceptionState.hadException())
diff --git a/third_party/WebKit/Source/core/workers/DedicatedWorkerTest.cpp b/third_party/WebKit/Source/core/workers/DedicatedWorkerTest.cpp
index 0856d0e6..69bc7f00 100644
--- a/third_party/WebKit/Source/core/workers/DedicatedWorkerTest.cpp
+++ b/third_party/WebKit/Source/core/workers/DedicatedWorkerTest.cpp
@@ -218,7 +218,7 @@
 
   void dispatchMessageEvent() {
     workerMessagingProxy()->postMessageToWorkerGlobalScope(
-        nullptr /* message */, nullptr /* channels */);
+        nullptr /* message */, MessagePortChannelArray());
   }
 
   InProcessWorkerMessagingProxyForTest* workerMessagingProxy() {
diff --git a/third_party/WebKit/Source/core/workers/InProcessWorkerBase.cpp b/third_party/WebKit/Source/core/workers/InProcessWorkerBase.cpp
index 80a0571..44736ce2 100644
--- a/third_party/WebKit/Source/core/workers/InProcessWorkerBase.cpp
+++ b/third_party/WebKit/Source/core/workers/InProcessWorkerBase.cpp
@@ -33,7 +33,7 @@
                                       ExceptionState& exceptionState) {
   DCHECK(m_contextProxy);
   // Disentangle the port in preparation for sending it to the remote context.
-  std::unique_ptr<MessagePortChannelArray> channels =
+  MessagePortChannelArray channels =
       MessagePort::disentanglePorts(scriptState->getExecutionContext(), ports,
                                     exceptionState);
   if (exceptionState.hadException())
diff --git a/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp b/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp
index 80a09f2..1dc6974 100644
--- a/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp
+++ b/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.cpp
@@ -119,7 +119,7 @@
 
 void InProcessWorkerMessagingProxy::postMessageToWorkerObject(
     PassRefPtr<SerializedScriptValue> message,
-    std::unique_ptr<MessagePortChannelArray> channels) {
+    MessagePortChannelArray channels) {
   DCHECK(isParentContextThread());
   if (!m_workerObject || askedToTerminate())
     return;
@@ -132,7 +132,7 @@
 
 void InProcessWorkerMessagingProxy::postMessageToWorkerGlobalScope(
     PassRefPtr<SerializedScriptValue> message,
-    std::unique_ptr<MessagePortChannelArray> channels) {
+    MessagePortChannelArray channels) {
   DCHECK(isParentContextThread());
   if (askedToTerminate())
     return;
@@ -240,7 +240,7 @@
 
 InProcessWorkerMessagingProxy::QueuedTask::QueuedTask(
     RefPtr<SerializedScriptValue> message,
-    std::unique_ptr<MessagePortChannelArray> channels)
+    MessagePortChannelArray channels)
     : message(std::move(message)), channels(std::move(channels)) {}
 
 InProcessWorkerMessagingProxy::QueuedTask::~QueuedTask() = default;
diff --git a/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.h b/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.h
index 26941b7..cc4e01f 100644
--- a/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.h
+++ b/third_party/WebKit/Source/core/workers/InProcessWorkerMessagingProxy.h
@@ -58,7 +58,7 @@
                               ContentSecurityPolicy*,
                               const String& referrerPolicy);
   void postMessageToWorkerGlobalScope(PassRefPtr<SerializedScriptValue>,
-                                      std::unique_ptr<MessagePortChannelArray>);
+                                      MessagePortChannelArray);
 
   void workerThreadCreated() override;
   void parentObjectDestroyed() override;
@@ -68,7 +68,7 @@
   // These methods come from worker context thread via
   // InProcessWorkerObjectProxy and are called on the parent context thread.
   void postMessageToWorkerObject(PassRefPtr<SerializedScriptValue>,
-                                 std::unique_ptr<MessagePortChannelArray>);
+                                 MessagePortChannelArray);
   void dispatchErrorEvent(const String& errorMessage,
                           std::unique_ptr<SourceLocation>,
                           int exceptionId);
@@ -100,10 +100,10 @@
 
   struct QueuedTask {
     RefPtr<SerializedScriptValue> message;
-    std::unique_ptr<MessagePortChannelArray> channels;
+    MessagePortChannelArray channels;
 
     QueuedTask(RefPtr<SerializedScriptValue> message,
-               std::unique_ptr<MessagePortChannelArray> channels);
+               MessagePortChannelArray channels);
     ~QueuedTask();
   };
 
diff --git a/third_party/WebKit/Source/core/workers/InProcessWorkerObjectProxy.cpp b/third_party/WebKit/Source/core/workers/InProcessWorkerObjectProxy.cpp
index 50217326..769ddc7 100644
--- a/third_party/WebKit/Source/core/workers/InProcessWorkerObjectProxy.cpp
+++ b/third_party/WebKit/Source/core/workers/InProcessWorkerObjectProxy.cpp
@@ -65,7 +65,7 @@
 
 void InProcessWorkerObjectProxy::postMessageToWorkerObject(
     PassRefPtr<SerializedScriptValue> message,
-    std::unique_ptr<MessagePortChannelArray> channels) {
+    MessagePortChannelArray channels) {
   getParentFrameTaskRunners()
       ->get(TaskType::PostedMessage)
       ->postTask(BLINK_FROM_HERE,
@@ -77,7 +77,7 @@
 
 void InProcessWorkerObjectProxy::processMessageFromWorkerObject(
     PassRefPtr<SerializedScriptValue> message,
-    std::unique_ptr<MessagePortChannelArray> channels,
+    MessagePortChannelArray channels,
     WorkerThread* workerThread) {
   WorkerGlobalScope* globalScope =
       toWorkerGlobalScope(workerThread->globalScope());
diff --git a/third_party/WebKit/Source/core/workers/InProcessWorkerObjectProxy.h b/third_party/WebKit/Source/core/workers/InProcessWorkerObjectProxy.h
index 4ae67c8..be723e9 100644
--- a/third_party/WebKit/Source/core/workers/InProcessWorkerObjectProxy.h
+++ b/third_party/WebKit/Source/core/workers/InProcessWorkerObjectProxy.h
@@ -66,12 +66,11 @@
   ~InProcessWorkerObjectProxy() override;
 
   void postMessageToWorkerObject(PassRefPtr<SerializedScriptValue>,
-                                 std::unique_ptr<MessagePortChannelArray>);
+                                 MessagePortChannelArray);
   void processUnhandledException(int exceptionId, WorkerThread*);
-  void processMessageFromWorkerObject(
-      PassRefPtr<SerializedScriptValue> message,
-      std::unique_ptr<MessagePortChannelArray> channels,
-      WorkerThread*);
+  void processMessageFromWorkerObject(PassRefPtr<SerializedScriptValue> message,
+                                      MessagePortChannelArray channels,
+                                      WorkerThread*);
 
   // ThreadedMessagingProxyBase overrides.
   void reportException(const String& errorMessage,
diff --git a/third_party/WebKit/Source/core/workers/Worklet.cpp b/third_party/WebKit/Source/core/workers/Worklet.cpp
index fdafbedf..1df2f559 100644
--- a/third_party/WebKit/Source/core/workers/Worklet.cpp
+++ b/third_party/WebKit/Source/core/workers/Worklet.cpp
@@ -20,8 +20,11 @@
 
 ScriptPromise Worklet::import(ScriptState* scriptState, const String& url) {
   DCHECK(isMainThread());
-  if (!isInitialized())
-    initialize();
+  if (!getExecutionContext()) {
+    return ScriptPromise::rejectWithDOMException(
+        scriptState, DOMException::create(InvalidStateError,
+                                          "This frame is already detached"));
+  }
 
   KURL scriptURL = getExecutionContext()->completeURL(url);
   if (!scriptURL.isValid()) {
@@ -30,6 +33,9 @@
         DOMException::create(SyntaxError, "'" + url + "' is not a valid URL."));
   }
 
+  if (!isInitialized())
+    initialize();
+
   ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
   ScriptPromise promise = resolver->promise();
 
diff --git a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerGlobalScope.cpp b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerGlobalScope.cpp
index 08b41a1a..aaced489 100644
--- a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerGlobalScope.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerGlobalScope.cpp
@@ -74,7 +74,7 @@
     const MessagePortArray& ports,
     ExceptionState& exceptionState) {
   // Disentangle the port in preparation for sending it to the remote context.
-  std::unique_ptr<MessagePortChannelArray> channels =
+  MessagePortChannelArray channels =
       MessagePort::disentanglePorts(scriptState->getExecutionContext(), ports,
                                     exceptionState);
   if (exceptionState.hadException())
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp
index 824dce3..fc6672b3 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorker.cpp
@@ -63,7 +63,7 @@
   }
 
   // Disentangle the port in preparation for sending it to the remote context.
-  std::unique_ptr<MessagePortChannelArray> channels =
+  MessagePortChannelArray channels =
       MessagePort::disentanglePorts(scriptState->getExecutionContext(), ports,
                                     exceptionState);
   if (exceptionState.hadException())
@@ -75,12 +75,12 @@
   }
 
   WebString messageString = message->toWireString();
-  std::unique_ptr<WebMessagePortChannelArray> webChannels =
+  WebMessagePortChannelArray webChannels =
       MessagePort::toWebMessagePortChannelArray(std::move(channels));
   m_handle->serviceWorker()->postMessage(
       client->provider(), messageString,
       WebSecurityOrigin(getExecutionContext()->getSecurityOrigin()),
-      webChannels.release());
+      std::move(webChannels));
 }
 
 void ServiceWorker::internalsTerminate() {
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerClient.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerClient.cpp
index d5a99c61..7434831 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerClient.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerClient.cpp
@@ -70,13 +70,13 @@
                                       ExceptionState& exceptionState) {
   ExecutionContext* context = scriptState->getExecutionContext();
   // Disentangle the port in preparation for sending it to the remote context.
-  std::unique_ptr<MessagePortChannelArray> channels =
+  MessagePortChannelArray channels =
       MessagePort::disentanglePorts(context, ports, exceptionState);
   if (exceptionState.hadException())
     return;
 
   WebString messageString = message->toWireString();
-  std::unique_ptr<WebMessagePortChannelArray> webChannels =
+  WebMessagePortChannelArray webChannels =
       MessagePort::toWebMessagePortChannelArray(std::move(channels));
   ServiceWorkerGlobalScopeClient::from(context)->postMessageToClient(
       m_uuid, messageString, std::move(webChannels));
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
index 0e35aeb..fb3272c 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
@@ -445,12 +445,12 @@
 void ServiceWorkerContainer::dispatchMessageEvent(
     std::unique_ptr<WebServiceWorker::Handle> handle,
     const WebString& message,
-    const WebMessagePortChannelArray& webChannels) {
+    WebMessagePortChannelArray webChannels) {
   if (!getExecutionContext() || !getExecutionContext()->executingWindow())
     return;
 
-  MessagePortArray* ports =
-      MessagePort::toMessagePortArray(getExecutionContext(), webChannels);
+  MessagePortArray* ports = MessagePort::toMessagePortArray(
+      getExecutionContext(), std::move(webChannels));
   RefPtr<SerializedScriptValue> value = SerializedScriptValue::create(message);
   ServiceWorker* source = ServiceWorker::from(
       getExecutionContext(), WTF::wrapUnique(handle.release()));
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.h
index a99198a..beb834f 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.h
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.h
@@ -92,7 +92,7 @@
                      bool shouldNotifyControllerChange) override;
   void dispatchMessageEvent(std::unique_ptr<WebServiceWorker::Handle>,
                             const WebString& message,
-                            const WebMessagePortChannelArray&) override;
+                            WebMessagePortChannelArray) override;
   void countFeature(uint32_t feature) override;
 
   // EventTarget overrides.
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h
index 58943e1..d9492aed 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerGlobalScopeClient.h
@@ -108,10 +108,9 @@
   virtual void didHandlePaymentRequestEvent(int paymentRequestEventID,
                                             WebServiceWorkerEventResult,
                                             double eventDispatchTime) = 0;
-  virtual void postMessageToClient(
-      const WebString& clientUUID,
-      const WebString& message,
-      std::unique_ptr<WebMessagePortChannelArray>) = 0;
+  virtual void postMessageToClient(const WebString& clientUUID,
+                                   const WebString& message,
+                                   WebMessagePortChannelArray) = 0;
   virtual void skipWaiting(
       std::unique_ptr<WebServiceWorkerSkipWaitingCallbacks>) = 0;
   virtual void claim(
diff --git a/third_party/WebKit/Source/platform/CrossThreadCopier.h b/third_party/WebKit/Source/platform/CrossThreadCopier.h
index a46f9d6..fd55b9c 100644
--- a/third_party/WebKit/Source/platform/CrossThreadCopier.h
+++ b/third_party/WebKit/Source/platform/CrossThreadCopier.h
@@ -149,6 +149,16 @@
   }
 };
 
+template <typename T, size_t inlineCapacity, typename Allocator>
+struct CrossThreadCopier<
+    Vector<std::unique_ptr<T>, inlineCapacity, Allocator>> {
+  STATIC_ONLY(CrossThreadCopier);
+  using Type = Vector<std::unique_ptr<T>, inlineCapacity, Allocator>;
+  static Type copy(Type pointer) {
+    return pointer;  // This is in fact a move.
+  }
+};
+
 template <typename T>
 struct CrossThreadCopier<CrossThreadPersistent<T>>
     : public CrossThreadCopierPassThrough<CrossThreadPersistent<T>> {
diff --git a/third_party/WebKit/Source/platform/fonts/Font.cpp b/third_party/WebKit/Source/platform/fonts/Font.cpp
index 17c0bd0d..6f362e8 100644
--- a/third_party/WebKit/Source/platform/fonts/Font.cpp
+++ b/third_party/WebKit/Source/platform/fonts/Font.cpp
@@ -260,12 +260,7 @@
         m_endIndex(m_buffer.size()),
         m_blobCount(0),
         m_rotation(buffer.isEmpty() ? NoRotation : computeBlobRotation(
-                                                       buffer.fontDataAt(0))) {
-    if (m_buffer.hasSkipInkExceptions()) {
-      while (m_endIndex > 0 && m_buffer.isSkipInkException(m_endIndex - 1))
-        m_endIndex--;
-    }
-  }
+                                                       buffer.fontDataAt(0))) {}
 
   bool done() const { return m_index >= m_endIndex; }
   unsigned blobCount() const { return m_blobCount; }
@@ -275,11 +270,6 @@
     const BlobRotation currentRotation = m_rotation;
 
     while (m_index < m_endIndex) {
-      if (m_buffer.hasSkipInkExceptions()) {
-        while (m_index < m_endIndex && m_buffer.isSkipInkException(m_index))
-          m_index++;
-      }
-
       const SimpleFontData* fontData = m_buffer.fontDataAt(m_index);
       ASSERT(fontData);
 
@@ -293,8 +283,7 @@
       }
 
       const unsigned start = m_index++;
-      while (m_index < m_endIndex && m_buffer.fontDataAt(m_index) == fontData &&
-             !m_buffer.isSkipInkException(m_index))
+      while (m_index < m_endIndex && m_buffer.fontDataAt(m_index) == fontData)
         m_index++;
 
       appendRun(start, m_index - start, fontData);
@@ -439,11 +428,7 @@
 
   DCHECK(!runInfo.cachedTextBlob);
 
-  GlyphBuffer glyphBuffer;
-  // Compute skip-ink exceptions in the GlyphBuffer.
-  // Skip the computation if 8Bit(), no such characters in Latin-1.
-  if (!runInfo.run.is8Bit())
-    glyphBuffer.saveSkipInkExceptions();
+  GlyphBuffer glyphBuffer(GlyphBuffer::Type::TextIntercepts);
   buildGlyphBuffer(runInfo, glyphBuffer);
 
   // Get the number of intervals, without copying the actual values by
diff --git a/third_party/WebKit/Source/platform/fonts/GlyphBuffer.h b/third_party/WebKit/Source/platform/fonts/GlyphBuffer.h
index 159a226..6b2abfa 100644
--- a/third_party/WebKit/Source/platform/fonts/GlyphBuffer.h
+++ b/third_party/WebKit/Source/platform/fonts/GlyphBuffer.h
@@ -43,6 +43,11 @@
   STACK_ALLOCATED();
 
  public:
+  enum class Type { Normal, TextIntercepts };
+  explicit GlyphBuffer(Type type = Type::Normal) : m_type(type) {}
+
+  Type type() const { return m_type; }
+
   bool isEmpty() const { return m_fontData.isEmpty(); }
   unsigned size() const {
     ASSERT(m_fontData.size() == m_glyphs.size());
@@ -111,25 +116,6 @@
     m_offsets.push_back(offset.y());
   }
 
-  void saveSkipInkExceptions() {
-    m_skipInkExceptions = WTF::makeUnique<Vector<bool, 2048>>();
-  }
-
-  bool hasSkipInkExceptions() const { return !!m_skipInkExceptions; }
-
-  bool isSkipInkException(unsigned index) const {
-    if (!m_skipInkExceptions)
-      return false;
-    DCHECK_EQ(m_skipInkExceptions->size(), m_offsets.size());
-    return (*m_skipInkExceptions)[index];
-  }
-
-  void addIsSkipInkException(bool value) {
-    DCHECK(hasSkipInkExceptions());
-    DCHECK_EQ(m_skipInkExceptions->size(), m_offsets.size() - 1);
-    m_skipInkExceptions->push_back(value);
-  }
-
  protected:
   Vector<const SimpleFontData*, 2048> m_fontData;
   Vector<Glyph, 2048> m_glyphs;
@@ -139,9 +125,7 @@
   // glyph positioning format used by Skia.
   Vector<float, 2048> m_offsets;
 
-  // Flag vector of identical size to m_offset, true when glyph is to be
-  // exempted from ink skipping, false otherwise.
-  std::unique_ptr<Vector<bool, 2048>> m_skipInkExceptions;
+  Type m_type;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
index c8c8fec..4514c13c 100644
--- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
+++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
@@ -17,15 +17,14 @@
 
 namespace {
 
-inline void addIsSkipInkException(GlyphBuffer* glyphBuffer,
-                                  const TextRun& run,
-                                  unsigned characterIndex) {
+inline bool isSkipInkException(const GlyphBuffer& glyphBuffer,
+                               const TextRun& run,
+                               unsigned characterIndex) {
   // We want to skip descenders in general, but it is undesirable renderings for
   // CJK characters.
-  DCHECK(!run.is8Bit()) << "8Bit() is always false, better to avoid to call";
-  UChar32 baseCharacter = run.codepointAt(characterIndex);
-  glyphBuffer->addIsSkipInkException(
-      Character::isCJKIdeographOrSymbol(baseCharacter));
+  return glyphBuffer.type() == GlyphBuffer::Type::TextIntercepts &&
+         !run.is8Bit() &&
+         Character::isCJKIdeographOrSymbol(run.codepointAt(characterIndex));
 }
 
 inline void addGlyphToBuffer(GlyphBuffer* glyphBuffer,
@@ -38,9 +37,9 @@
   FloatPoint startOffset = HB_DIRECTION_IS_HORIZONTAL(direction)
                                ? FloatPoint(advance, 0)
                                : FloatPoint(0, advance);
-  glyphBuffer->add(glyphData.glyph, fontData, startOffset + glyphData.offset);
-  if (glyphBuffer->hasSkipInkExceptions())
-    addIsSkipInkException(glyphBuffer, run, characterIndex);
+  if (!isSkipInkException(*glyphBuffer, run, characterIndex)) {
+    glyphBuffer->add(glyphData.glyph, fontData, startOffset + glyphData.offset);
+  }
 }
 
 inline void addEmphasisMark(GlyphBuffer* buffer,
@@ -233,11 +232,10 @@
       for (const auto& glyphData : run->m_glyphData) {
         ASSERT(!glyphData.offset.height());
 
-        glyphBuffer->add(glyphData.glyph, run->m_fontData.get(),
-                         advance + glyphData.offset.width());
-        if (glyphBuffer->hasSkipInkExceptions()) {
-          addIsSkipInkException(glyphBuffer, textRun,
-                                characterIndex + glyphData.characterIndex);
+        if (!isSkipInkException(*glyphBuffer, textRun,
+                                characterIndex + glyphData.characterIndex)) {
+          glyphBuffer->add(glyphData.glyph, run->m_fontData.get(),
+                           advance + glyphData.offset.width());
         }
 
         advance += glyphData.advance;
diff --git a/third_party/WebKit/Source/platform/heap/BUILD.gn b/third_party/WebKit/Source/platform/heap/BUILD.gn
index ff9abe99..48ad22d 100644
--- a/third_party/WebKit/Source/platform/heap/BUILD.gn
+++ b/third_party/WebKit/Source/platform/heap/BUILD.gn
@@ -11,8 +11,6 @@
 
   sources = [
     "BlinkGC.h",
-    "BlinkGCInterruptor.cpp",
-    "BlinkGCInterruptor.h",
     "BlinkGCMemoryDumpProvider.cpp",
     "BlinkGCMemoryDumpProvider.h",
     "CallbackStack.cpp",
diff --git a/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.cpp b/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.cpp
deleted file mode 100644
index 0409eaa..0000000
--- a/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "platform/heap/BlinkGCInterruptor.h"
-
-#include "platform/heap/BlinkGC.h"
-#include "platform/heap/ThreadState.h"
-
-namespace blink {
-
-void BlinkGCInterruptor::onInterrupted() {
-  ThreadState* state = ThreadState::current();
-  ASSERT(state);
-  state->safePoint(BlinkGC::HeapPointersOnStack);
-}
-
-}  // namespace blink
diff --git a/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.h b/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.h
deleted file mode 100644
index 3b1a1fe..0000000
--- a/third_party/WebKit/Source/platform/heap/BlinkGCInterruptor.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BlinkGCInterruptor_h
-#define BlinkGCInterruptor_h
-
-#include "platform/PlatformExport.h"
-#include "wtf/Allocator.h"
-
-namespace blink {
-
-// If attached thread enters long running loop that can call back
-// into Blink and leaving and reentering safepoint at every
-// transition between this loop and Blink is deemed too expensive
-// then instead of marking this loop as a GC safepoint thread
-// can provide an interruptor object which would allow GC
-// to temporarily interrupt and pause this long running loop at
-// an arbitrary moment creating a safepoint for a GC.
-class PLATFORM_EXPORT BlinkGCInterruptor {
-  USING_FAST_MALLOC(BlinkGCInterruptor);
-
- public:
-  virtual ~BlinkGCInterruptor() {}
-
-  // Request the interruptor to interrupt the thread and
-  // call onInterrupted on that thread once interruption
-  // succeeds.
-  virtual void requestInterrupt() = 0;
-
- protected:
-  // This method is called on the interrupted thread to
-  // create a safepoint for a GC.
-  void onInterrupted();
-};
-
-}  // namespace blink
-
-#endif
diff --git a/third_party/WebKit/Source/platform/heap/GCTaskRunner.h b/third_party/WebKit/Source/platform/heap/GCTaskRunner.h
index 60f7156..5b9d114 100644
--- a/third_party/WebKit/Source/platform/heap/GCTaskRunner.h
+++ b/third_party/WebKit/Source/platform/heap/GCTaskRunner.h
@@ -41,30 +41,6 @@
 
 namespace blink {
 
-class MessageLoopInterruptor final : public BlinkGCInterruptor {
- public:
-  explicit MessageLoopInterruptor(RefPtr<WebTaskRunner> taskRunner)
-      : m_taskRunner(std::move(taskRunner)) {}
-
-  void requestInterrupt() override {
-    // GCTask has an empty run() method. Its only purpose is to guarantee
-    // that MessageLoop will have a task to process which will result
-    // in GCTaskRunner::didProcessTask being executed.
-    m_taskRunner->postTask(BLINK_FROM_HERE, crossThreadBind(&runGCTask));
-  }
-
- private:
-  static void runGCTask() {
-    // Don't do anything here because we don't know if this is
-    // a nested event loop or not. GCTaskRunner::didProcessTask
-    // will enter correct safepoint for us.
-    // We are not calling onInterrupted() because that always
-    // conservatively enters safepoint with pointers on stack.
-  }
-
-  RefPtr<WebTaskRunner> m_taskRunner;
-};
-
 class GCTaskObserver final : public WebThread::TaskObserver {
   USING_FAST_MALLOC(GCTaskObserver);
 
@@ -103,8 +79,6 @@
       : m_gcTaskObserver(WTF::wrapUnique(new GCTaskObserver)),
         m_thread(thread) {
     m_thread->addTaskObserver(m_gcTaskObserver.get());
-    ThreadState::current()->addInterruptor(WTF::wrapUnique(
-        new MessageLoopInterruptor(thread->getWebTaskRunner())));
   }
 
   ~GCTaskRunner() { m_thread->removeTaskObserver(m_gcTaskObserver.get()); }
diff --git a/third_party/WebKit/Source/platform/heap/ThreadState.cpp b/third_party/WebKit/Source/platform/heap/ThreadState.cpp
index d1d0619..a41c70b 100644
--- a/third_party/WebKit/Source/platform/heap/ThreadState.cpp
+++ b/third_party/WebKit/Source/platform/heap/ThreadState.cpp
@@ -105,7 +105,6 @@
       m_startOfStack(reinterpret_cast<intptr_t*>(WTF::getStackStart())),
       m_endOfStack(reinterpret_cast<intptr_t*>(WTF::getStackStart())),
       m_safePointScopeMarker(nullptr),
-      m_interruptors(),
       m_sweepForbidden(false),
       m_noAllocationCount(0),
       m_gcForbiddenCount(0),
@@ -1203,16 +1202,6 @@
   }
 }
 
-void ThreadState::addInterruptor(
-    std::unique_ptr<BlinkGCInterruptor> interruptor) {
-  ASSERT(checkThread());
-  SafePointScope scope(BlinkGC::HeapPointersOnStack);
-  {
-    MutexLocker locker(m_heap->threadAttachMutex());
-    m_interruptors.push_back(std::move(interruptor));
-  }
-}
-
 void ThreadState::registerStaticPersistentNode(
     PersistentNode* node,
     PersistentClearCallback callback) {
diff --git a/third_party/WebKit/Source/platform/heap/ThreadState.h b/third_party/WebKit/Source/platform/heap/ThreadState.h
index f709153..95e373a 100644
--- a/third_party/WebKit/Source/platform/heap/ThreadState.h
+++ b/third_party/WebKit/Source/platform/heap/ThreadState.h
@@ -33,7 +33,6 @@
 
 #include "platform/PlatformExport.h"
 #include "platform/heap/BlinkGC.h"
-#include "platform/heap/BlinkGCInterruptor.h"
 #include "platform/heap/ThreadingTraits.h"
 #include "public/platform/WebThread.h"
 #include "wtf/AddressSanitizer.h"
@@ -319,11 +318,7 @@
   //     safePoint() method;
   //   - use SafePointScope around long running loops that have no safePoint()
   //     invocation inside, such loops must not touch any heap object;
-  //   - register an BlinkGCInterruptor that can interrupt long running loops
-  //     that have no calls to safePoint and are not wrapped in a SafePointScope
-  //     (e.g. BlinkGCInterruptor for JavaScript code)
   //
-
   // Check if GC is requested by another thread and pause this thread if this is
   // the case.  Can only be called when current thread is in a consistent state.
   void safePoint(BlinkGC::StackState);
@@ -332,8 +327,6 @@
   void enterSafePoint(BlinkGC::StackState, void*);
   void leaveSafePoint();
 
-  void addInterruptor(std::unique_ptr<BlinkGCInterruptor>);
-
   void recordStackEnd(intptr_t* endOfStack) { m_endOfStack = endOfStack; }
 
   // Get one of the heap structures for this thread.
@@ -608,11 +601,6 @@
 
   void reportMemoryToV8();
 
-  // Should only be called under protection of threadAttachMutex().
-  const Vector<std::unique_ptr<BlinkGCInterruptor>>& interruptors() const {
-    return m_interruptors;
-  }
-
   friend class SafePointBarrier;
   friend class SafePointScope;
 
@@ -636,7 +624,6 @@
 
   void* m_safePointScopeMarker;
   Vector<Address> m_safePointStackCopy;
-  Vector<std::unique_ptr<BlinkGCInterruptor>> m_interruptors;
   bool m_sweepForbidden;
   size_t m_noAllocationCount;
   size_t m_gcForbiddenCount;
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeClientImpl.cpp b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeClientImpl.cpp
index 8fd4855..907f36b 100644
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeClientImpl.cpp
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeClientImpl.cpp
@@ -159,8 +159,8 @@
 void ServiceWorkerGlobalScopeClientImpl::postMessageToClient(
     const WebString& clientUUID,
     const WebString& message,
-    std::unique_ptr<WebMessagePortChannelArray> webChannels) {
-  m_client.postMessageToClient(clientUUID, message, webChannels.release());
+    WebMessagePortChannelArray webChannels) {
+  m_client.postMessageToClient(clientUUID, message, std::move(webChannels));
 }
 
 void ServiceWorkerGlobalScopeClientImpl::skipWaiting(
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeClientImpl.h b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeClientImpl.h
index e89781a..93ca3a2 100644
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeClientImpl.h
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeClientImpl.h
@@ -93,10 +93,9 @@
   void didHandlePaymentRequestEvent(int paymentRequestEventID,
                                     WebServiceWorkerEventResult,
                                     double eventDispatchTime) override;
-  void postMessageToClient(
-      const WebString& clientUUID,
-      const WebString& message,
-      std::unique_ptr<WebMessagePortChannelArray>) override;
+  void postMessageToClient(const WebString& clientUUID,
+                           const WebString& message,
+                           WebMessagePortChannelArray) override;
   void skipWaiting(
       std::unique_ptr<WebServiceWorkerSkipWaitingCallbacks>) override;
   void claim(std::unique_ptr<WebServiceWorkerClientsClaimCallbacks>) override;
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
index 3c2ac91d..77df99e 100644
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.cpp
@@ -110,12 +110,12 @@
     int eventID,
     const WebString& message,
     const WebSecurityOrigin& sourceOrigin,
-    const WebMessagePortChannelArray& webChannels,
+    WebMessagePortChannelArray webChannels,
     const WebServiceWorkerClientInfo& client) {
   WebSerializedScriptValue value =
       WebSerializedScriptValue::fromString(message);
-  MessagePortArray* ports =
-      MessagePort::toMessagePortArray(m_workerGlobalScope, webChannels);
+  MessagePortArray* ports = MessagePort::toMessagePortArray(
+      m_workerGlobalScope, std::move(webChannels));
   String origin;
   if (!sourceOrigin.isUnique())
     origin = sourceOrigin.toString();
@@ -136,12 +136,12 @@
     int eventID,
     const WebString& message,
     const WebSecurityOrigin& sourceOrigin,
-    const WebMessagePortChannelArray& webChannels,
+    WebMessagePortChannelArray webChannels,
     std::unique_ptr<WebServiceWorker::Handle> handle) {
   WebSerializedScriptValue value =
       WebSerializedScriptValue::fromString(message);
-  MessagePortArray* ports =
-      MessagePort::toMessagePortArray(m_workerGlobalScope, webChannels);
+  MessagePortArray* ports = MessagePort::toMessagePortArray(
+      m_workerGlobalScope, std::move(webChannels));
   String origin;
   if (!sourceOrigin.isUnique())
     origin = sourceOrigin.toString();
diff --git a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
index 0cdca6f1..2dd2328fd 100644
--- a/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
+++ b/third_party/WebKit/Source/web/ServiceWorkerGlobalScopeProxy.h
@@ -85,13 +85,13 @@
       int eventID,
       const WebString& message,
       const WebSecurityOrigin& sourceOrigin,
-      const WebMessagePortChannelArray&,
+      WebMessagePortChannelArray,
       const WebServiceWorkerClientInfo&) override;
   void dispatchExtendableMessageEvent(
       int eventID,
       const WebString& message,
       const WebSecurityOrigin& sourceOrigin,
-      const WebMessagePortChannelArray&,
+      WebMessagePortChannelArray,
       std::unique_ptr<WebServiceWorker::Handle>) override;
   void dispatchFetchEvent(int fetchEventID,
                           const WebServiceWorkerRequest&,
diff --git a/third_party/WebKit/Source/web/WebDOMMessageEvent.cpp b/third_party/WebKit/Source/web/WebDOMMessageEvent.cpp
index 897bb6d..c51b4fc 100644
--- a/third_party/WebKit/Source/web/WebDOMMessageEvent.cpp
+++ b/third_party/WebKit/Source/web/WebDOMMessageEvent.cpp
@@ -48,7 +48,7 @@
     const WebString& origin,
     const WebFrame* sourceFrame,
     const WebDocument& targetDocument,
-    const WebMessagePortChannelArray& channels)
+    WebMessagePortChannelArray channels)
     : WebDOMMessageEvent(MessageEvent::create()) {
   DOMWindow* window = nullptr;
   if (sourceFrame)
@@ -56,7 +56,7 @@
   MessagePortArray* ports = nullptr;
   if (!targetDocument.isNull()) {
     Document* coreDocument = targetDocument;
-    ports = MessagePort::toMessagePortArray(coreDocument, channels);
+    ports = MessagePort::toMessagePortArray(coreDocument, std::move(channels));
   }
   // Use an empty array for |ports| when it is null because this function
   // is used to implement postMessage().
@@ -79,12 +79,10 @@
 }
 
 WebMessagePortChannelArray WebDOMMessageEvent::releaseChannels() {
-  MessagePortChannelArray* channels = constUnwrap<MessageEvent>()->channels();
-  WebMessagePortChannelArray webChannels(channels ? channels->size() : 0);
-  if (channels) {
-    for (size_t i = 0; i < channels->size(); ++i)
-      webChannels[i] = (*channels)[i].release();
-  }
+  MessagePortChannelArray channels = unwrap<MessageEvent>()->releaseChannels();
+  WebMessagePortChannelArray webChannels(channels.size());
+  for (size_t i = 0; i < channels.size(); ++i)
+    webChannels[i] = std::move(channels[i]);
   return webChannels;
 }
 
diff --git a/third_party/WebKit/Source/web/WebEmbeddedWorkerImplTest.cpp b/third_party/WebKit/Source/web/WebEmbeddedWorkerImplTest.cpp
index a6a0c7d..e7aa6ec 100644
--- a/third_party/WebKit/Source/web/WebEmbeddedWorkerImplTest.cpp
+++ b/third_party/WebKit/Source/web/WebEmbeddedWorkerImplTest.cpp
@@ -51,7 +51,7 @@
   }
   void postMessageToClient(const WebString& uuid,
                            const WebString&,
-                           WebMessagePortChannelArray*) override {
+                           WebMessagePortChannelArray) override {
     NOTREACHED();
   }
   void skipWaiting(
diff --git a/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp b/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp
index 3139790..32cae1d 100644
--- a/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp
+++ b/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp
@@ -1166,4 +1166,9 @@
                 MainThreadScrollingReason::kHasBorderRadius);
 }
 
+TEST_P(StyleRelatedMainThreadScrollingReasonTest, BoxShadowTest) {
+  testStyle("box-shadow",
+            MainThreadScrollingReason::kHasBoxShadowFromNonRootLayer);
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/web/tests/data/two_scrollable_area.html b/third_party/WebKit/Source/web/tests/data/two_scrollable_area.html
index b7dba5e..9de7288 100644
--- a/third_party/WebKit/Source/web/tests/data/two_scrollable_area.html
+++ b/third_party/WebKit/Source/web/tests/data/two_scrollable_area.html
@@ -27,6 +27,11 @@
   clip-path: circle(115px at 20px 20px);
 }
 
+.box-shadow {
+  box-shadow: 10px 10px 5px #888888;
+  will-change:transform; /*This reason is not recorded for root layer*/
+}
+
 .content {
   height: 500px;
 }
diff --git a/third_party/WebKit/public/platform/WebMessagePortChannel.h b/third_party/WebKit/public/platform/WebMessagePortChannel.h
index 0739fbf..8571553 100644
--- a/third_party/WebKit/public/platform/WebMessagePortChannel.h
+++ b/third_party/WebKit/public/platform/WebMessagePortChannel.h
@@ -33,48 +33,28 @@
 
 #include "WebCommon.h"
 #include "WebVector.h"
-
-#if INSIDE_BLINK
 #include <memory>
-#endif
 
 namespace blink {
 
 class WebMessagePortChannelClient;
 class WebString;
 
-typedef WebVector<class WebMessagePortChannel*> WebMessagePortChannelArray;
+using WebMessagePortChannelUniquePtr =
+    std::unique_ptr<class WebMessagePortChannel>;
+using WebMessagePortChannelArray = WebVector<WebMessagePortChannelUniquePtr>;
 
-// Provides an interface to a Message Port Channel implementation. The object
-// owns itself and is signalled that its not needed anymore with the destroy()
-// call.
+// Provides an interface to a Message Port Channel implementation.
 class WebMessagePortChannel {
  public:
+  virtual ~WebMessagePortChannel() {}
   virtual void setClient(WebMessagePortChannelClient*) = 0;
-  virtual void destroy() = 0;
   // Callee receives ownership of the passed vector.
   // FIXME: Blob refs should be passed to maintain ref counts. crbug.com/351753
-  virtual void postMessage(const WebString&, WebMessagePortChannelArray*) = 0;
+  virtual void postMessage(const WebString&, WebMessagePortChannelArray) = 0;
   virtual bool tryGetMessage(WebString*, WebMessagePortChannelArray&) = 0;
-
- protected:
-  ~WebMessagePortChannel() {}
 };
 
-#if INSIDE_BLINK
-
-struct WebMessagePortChannelDeleter {
-  void operator()(WebMessagePortChannel* channel) {
-    if (channel)
-      channel->destroy();
-  }
-};
-
-using WebMessagePortChannelUniquePtr =
-    std::unique_ptr<WebMessagePortChannel, WebMessagePortChannelDeleter>;
-
-#endif  // INSIDE_BLINK
-
 }  // namespace blink
 
 #endif  // WebMessagePortChannel_h
diff --git a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorker.h b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorker.h
index 5e6f2f5..4e6c28b 100644
--- a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorker.h
+++ b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorker.h
@@ -43,7 +43,6 @@
 class WebSecurityOrigin;
 class WebServiceWorkerProvider;
 class WebServiceWorkerProxy;
-typedef WebVector<class WebMessagePortChannel*> WebMessagePortChannelArray;
 
 class WebServiceWorker {
  public:
@@ -76,7 +75,7 @@
   virtual void postMessage(WebServiceWorkerProvider*,
                            const WebString&,
                            const WebSecurityOrigin&,
-                           WebMessagePortChannelArray*) = 0;
+                           WebMessagePortChannelArray) = 0;
 
   virtual void terminate() {}
 };
diff --git a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerProviderClient.h b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerProviderClient.h
index 2b129cd..9501144d 100644
--- a/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerProviderClient.h
+++ b/third_party/WebKit/public/platform/modules/serviceworker/WebServiceWorkerProviderClient.h
@@ -51,11 +51,9 @@
   virtual void setController(std::unique_ptr<WebServiceWorker::Handle>,
                              bool shouldNotifyControllerChange) = 0;
 
-  virtual void dispatchMessageEvent(
-      std::unique_ptr<WebServiceWorker::Handle>,
-      const WebString& message,
-      const WebMessagePortChannelArray& channels) = 0;
-
+  virtual void dispatchMessageEvent(std::unique_ptr<WebServiceWorker::Handle>,
+                                    const WebString& message,
+                                    WebMessagePortChannelArray channels) = 0;
   virtual void countFeature(uint32_t feature) = 0;
 };
 
diff --git a/third_party/WebKit/public/web/WebDOMMessageEvent.h b/third_party/WebKit/public/web/WebDOMMessageEvent.h
index e9c34818..4f29ba9 100644
--- a/third_party/WebKit/public/web/WebDOMMessageEvent.h
+++ b/third_party/WebKit/public/web/WebDOMMessageEvent.h
@@ -54,8 +54,7 @@
       const WebString& origin = WebString(),
       const WebFrame* sourceFrame = nullptr,
       const WebDocument& targetDocument = WebDocument(),
-      const WebMessagePortChannelArray& channels =
-          WebMessagePortChannelArray());
+      WebMessagePortChannelArray channels = WebMessagePortChannelArray());
   WebDOMMessageEvent() {}
 
   BLINK_EXPORT WebSerializedScriptValue data() const;
diff --git a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h
index e06bd92..75e31d9 100644
--- a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h
+++ b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextClient.h
@@ -247,7 +247,7 @@
   // FIXME: Blob refs should be passed to maintain ref counts. crbug.com/351753
   virtual void postMessageToClient(const WebString& uuid,
                                    const WebString&,
-                                   WebMessagePortChannelArray*) = 0;
+                                   WebMessagePortChannelArray) = 0;
 
   // Ownership of the passed callbacks is transferred to the callee, callee
   // should delete the callbacks after run.
diff --git a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h
index 579c66d..8fbd8d0 100644
--- a/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h
+++ b/third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerContextProxy.h
@@ -62,13 +62,13 @@
       int eventID,
       const WebString& message,
       const WebSecurityOrigin& sourceOrigin,
-      const WebMessagePortChannelArray&,
+      WebMessagePortChannelArray,
       const WebServiceWorkerClientInfo&) = 0;
   virtual void dispatchExtendableMessageEvent(
       int eventID,
       const WebString& message,
       const WebSecurityOrigin& sourceOrigin,
-      const WebMessagePortChannelArray&,
+      WebMessagePortChannelArray,
       std::unique_ptr<WebServiceWorker::Handle>) = 0;
   virtual void dispatchInstallEvent(int eventID) = 0;
   virtual void dispatchFetchEvent(int fetchEventID,
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 561bd711..cd2e7256 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -66699,6 +66699,22 @@
   </summary>
 </histogram>
 
+<histogram name="Storage.Blob.RegisterBlobTime" units="ms">
+  <owner>darin@chromium.org</owner>
+  <summary>
+    The amount of time taken to complete the synchronous
+    BlobStorageMsg_RegisterBlob IPC.
+  </summary>
+</histogram>
+
+<histogram name="Storage.Blob.RegisterPublicURLTime" units="ms">
+  <owner>darin@chromium.org</owner>
+  <summary>
+    The amount of time taken to complete the synchronous
+    BlobStorageMsg_RegisterPublicURL IPC.
+  </summary>
+</histogram>
+
 <histogram name="Storage.Blob.RendererFileSeekFailed" enum="Boolean">
   <owner>dmurph@chromium.org</owner>
   <summary>
diff --git a/ui/aura/mus/window_tree_client.cc b/ui/aura/mus/window_tree_client.cc
index 9b2079e..d5cef71 100644
--- a/ui/aura/mus/window_tree_client.cc
+++ b/ui/aura/mus/window_tree_client.cc
@@ -198,28 +198,8 @@
   for (WindowTreeClientObserver& observer : observers_)
     observer.OnWillDestroyClient(this);
 
-  std::vector<Window*> non_owned;
-  WindowTracker tracker;
-  while (!windows_.empty()) {
-    IdToWindowMap::iterator it = windows_.begin();
-    if (WasCreatedByThisClient(it->second)) {
-      const Id window_id = it->second->server_id();
-      delete it->second->GetWindow();
-      DCHECK_EQ(0u, windows_.count(window_id));
-    } else {
-      tracker.Add(it->second->GetWindow());
-      windows_.erase(it);
-    }
-  }
-
-  // Delete the non-owned windows last. In the typical case these are roots. The
-  // exception is the window manager and embed roots, which may know about
-  // other random windows that it doesn't own.
-  while (!tracker.windows().empty())
-    delete tracker.windows().front();
-
-  for (WindowTreeClientObserver& observer : observers_)
-    observer.OnDidDestroyClient(this);
+  // Clients should properly delete all of their windows before shutdown.
+  CHECK(windows_.empty());
 
   capture_synchronizer_.reset();
 
diff --git a/ui/aura/mus/window_tree_client_observer.h b/ui/aura/mus/window_tree_client_observer.h
index 7d108059..7410549 100644
--- a/ui/aura/mus/window_tree_client_observer.h
+++ b/ui/aura/mus/window_tree_client_observer.h
@@ -13,14 +13,9 @@
 
 class AURA_EXPORT WindowTreeClientObserver {
  public:
-  // Called early on in the destructor of WindowTreeClient; before any windows
-  // have been destroyed.
+  // Called early on in the destructor of WindowTreeClient.
   virtual void OnWillDestroyClient(WindowTreeClient* client) {}
 
-  // Called at the end of WindowTreeClient's destructor. At this point
-  // observers should drop all references to |client|.
-  virtual void OnDidDestroyClient(WindowTreeClient* client) {}
-
  protected:
   virtual ~WindowTreeClientObserver() {}
 };
diff --git a/ui/events/keycodes/keyboard_code_conversion_xkb.cc b/ui/events/keycodes/keyboard_code_conversion_xkb.cc
index e164054..0a3a5206 100644
--- a/ui/events/keycodes/keyboard_code_conversion_xkb.cc
+++ b/ui/events/keycodes/keyboard_code_conversion_xkb.cc
@@ -62,7 +62,7 @@
       return DomKey::KANA_MODE;
     case XKB_KEY_Eisu_Shift:
     case XKB_KEY_Eisu_toggle:
-      return DomKey::EISU;
+      return DomKey::ALPHANUMERIC;
     case XKB_KEY_Hangul:
       return DomKey::HANGUL_MODE;
     case XKB_KEY_Hangul_Hanja:
diff --git a/ui/gl/gl_implementation.cc b/ui/gl/gl_implementation.cc
index 73154b3..9235cb93 100644
--- a/ui/gl/gl_implementation.cc
+++ b/ui/gl/gl_implementation.cc
@@ -80,6 +80,10 @@
   return kGLImplementationNone;
 }
 
+GLImplementation GetSoftwareGLImplementation() {
+  return kGLImplementationOSMesaGL;
+}
+
 const char* GetGLImplementationName(GLImplementation implementation) {
   for (size_t i = 0; i < arraysize(kGLImplementationNamePairs); ++i) {
     if (implementation == kGLImplementationNamePairs[i].implementation)
diff --git a/ui/gl/gl_implementation.h b/ui/gl/gl_implementation.h
index 23c9629..28cbde27 100644
--- a/ui/gl/gl_implementation.h
+++ b/ui/gl/gl_implementation.h
@@ -79,6 +79,9 @@
 // Get the current GL implementation.
 GL_EXPORT GLImplementation GetGLImplementation();
 
+// Get the software GL implementation for the current platform.
+GL_EXPORT GLImplementation GetSoftwareGLImplementation();
+
 // Does the underlying GL support all features from Desktop GL 2.0 that were
 // removed from the ES 2.0 spec without requiring specific extension strings.
 GL_EXPORT bool HasDesktopGLFeatures();
diff --git a/ui/gl/gl_switches.cc b/ui/gl/gl_switches.cc
index 3fabe5c..8171048 100644
--- a/ui/gl/gl_switches.cc
+++ b/ui/gl/gl_switches.cc
@@ -68,6 +68,7 @@
 //  egl: whatever EGL / GLES2 the user has installed (Windows default - actually
 //       ANGLE).
 //  osmesa: The OSMesa software renderer.
+//  swiftshader: The SwiftShader software renderer.
 const char kUseGL[]                         = "use-gl";
 
 const char kSwiftShaderPath[]               = "swiftshader-path";
@@ -104,9 +105,9 @@
 // the GL output will not be correct but tests will run faster.
 const char kDisableGLDrawingForTests[] = "disable-gl-drawing-for-tests";
 
-// Forces the use of OSMesa instead of hardware gpu.
-const char kOverrideUseGLWithOSMesaForTests[] =
-    "override-use-gl-with-osmesa-for-tests";
+// Forces the use of software GL instead of hardware gpu.
+const char kOverrideUseSoftwareGLForTests[] =
+    "override-use-software-gl-for-tests";
 
 // Disables specified comma separated GL Extensions if found.
 const char kDisableGLExtensions[] = "disable-gl-extensions";
@@ -125,7 +126,7 @@
     kEnableSgiVideoSync,
     kGpuNoContextLost,
     kDisableGLDrawingForTests,
-    kOverrideUseGLWithOSMesaForTests,
+    kOverrideUseSoftwareGLForTests,
     kUseANGLE,
     kDisableDirectComposition,
     kEnableSwapBuffersWithBounds,
diff --git a/ui/gl/gl_switches.h b/ui/gl/gl_switches.h
index a6c398a3..270b3fc 100644
--- a/ui/gl/gl_switches.h
+++ b/ui/gl/gl_switches.h
@@ -57,7 +57,7 @@
 
 // These flags are used by the test harness code, not passed in by users.
 GL_EXPORT extern const char kDisableGLDrawingForTests[];
-GL_EXPORT extern const char kOverrideUseGLWithOSMesaForTests[];
+GL_EXPORT extern const char kOverrideUseSoftwareGLForTests[];
 
 GL_EXPORT extern const char* kGLSwitchesCopiedFromGpuProcessHost[];
 GL_EXPORT extern const int kGLSwitchesCopiedFromGpuProcessHostNumSwitches;
diff --git a/ui/gl/init/gl_factory.cc b/ui/gl/init/gl_factory.cc
index 376ab44..20da613 100644
--- a/ui/gl/init/gl_factory.cc
+++ b/ui/gl/init/gl_factory.cc
@@ -29,14 +29,14 @@
 
   // The default implementation is always the first one in list.
   GLImplementation impl = allowed_impls[0];
-  bool fallback_to_osmesa = false;
-  if (cmd->HasSwitch(switches::kOverrideUseGLWithOSMesaForTests)) {
-    impl = kGLImplementationOSMesaGL;
+  bool fallback_to_software_gl = false;
+  if (cmd->HasSwitch(switches::kOverrideUseSoftwareGLForTests)) {
+    impl = GetSoftwareGLImplementation();
   } else if (cmd->HasSwitch(switches::kUseGL)) {
     std::string requested_implementation_name =
         cmd->GetSwitchValueASCII(switches::kUseGL);
     if (requested_implementation_name == "any") {
-      fallback_to_osmesa = true;
+      fallback_to_software_gl = true;
     } else if (requested_implementation_name ==
                kGLImplementationSwiftShaderName) {
       impl = kGLImplementationSwiftShaderGL;
@@ -57,18 +57,18 @@
   bool disable_gl_drawing = cmd->HasSwitch(switches::kDisableGLDrawingForTests);
 
   return InitializeGLOneOffImplementation(
-      impl, fallback_to_osmesa, gpu_service_logging, disable_gl_drawing);
+      impl, fallback_to_software_gl, gpu_service_logging, disable_gl_drawing);
 }
 
 bool InitializeGLOneOffImplementation(GLImplementation impl,
-                                      bool fallback_to_osmesa,
+                                      bool fallback_to_software_gl,
                                       bool gpu_service_logging,
                                       bool disable_gl_drawing) {
   bool initialized =
       InitializeStaticGLBindings(impl) && InitializeGLOneOffPlatform();
-  if (!initialized && fallback_to_osmesa) {
+  if (!initialized && fallback_to_software_gl) {
     ShutdownGL();
-    initialized = InitializeStaticGLBindings(kGLImplementationOSMesaGL) &&
+    initialized = InitializeStaticGLBindings(GetSoftwareGLImplementation()) &&
                   InitializeGLOneOffPlatform();
   }
   if (!initialized)
diff --git a/ui/gl/init/gl_factory.h b/ui/gl/init/gl_factory.h
index 4e62d210..c3908fa 100644
--- a/ui/gl/init/gl_factory.h
+++ b/ui/gl/init/gl_factory.h
@@ -33,10 +33,11 @@
 
 // Initializes GL bindings using the provided parameters. This might be required
 // for use in tests, otherwise use InitializeGLOneOff() instead.
-GL_INIT_EXPORT bool InitializeGLOneOffImplementation(GLImplementation impl,
-                                                     bool fallback_to_osmesa,
-                                                     bool gpu_service_logging,
-                                                     bool disable_gl_drawing);
+GL_INIT_EXPORT bool InitializeGLOneOffImplementation(
+    GLImplementation impl,
+    bool fallback_to_software_gl,
+    bool gpu_service_logging,
+    bool disable_gl_drawing);
 
 // Clears GL bindings and resets GL implementation.
 GL_INIT_EXPORT void ShutdownGL();
diff --git a/ui/gl/test/gl_surface_test_support.cc b/ui/gl/test/gl_surface_test_support.cc
index a610c2af..272e0fd7 100644
--- a/ui/gl/test/gl_surface_test_support.cc
+++ b/ui/gl/test/gl_surface_test_support.cc
@@ -34,18 +34,18 @@
 #endif
   ui::test::EnableTestConfigForPlatformWindows();
 
-  bool use_osmesa = true;
+  bool use_software_gl = true;
 
-  // We usually use OSMesa as this works on all bots. The command line can
-  // override this behaviour to use hardware GL.
+  // We usually use software GL as this works on all bots. The
+  // command line can override this behaviour to use hardware GL.
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kUseGpuInTests)) {
-    use_osmesa = false;
+    use_software_gl = false;
   }
 
 #if defined(OS_ANDROID)
   // On Android we always use hardware GL.
-  use_osmesa = false;
+  use_software_gl = false;
 #endif
 
   std::vector<GLImplementation> allowed_impls =
@@ -53,24 +53,24 @@
   DCHECK(!allowed_impls.empty());
 
   GLImplementation impl = allowed_impls[0];
-  if (use_osmesa)
-    impl = kGLImplementationOSMesaGL;
+  if (use_software_gl)
+    impl = gl::GetSoftwareGLImplementation();
 
   DCHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGL))
       << "kUseGL has not effect in tests";
 
-  bool fallback_to_osmesa = false;
+  bool fallback_to_software_gl = false;
   bool gpu_service_logging = false;
   bool disable_gl_drawing = true;
 
   CHECK(init::InitializeGLOneOffImplementation(
-      impl, fallback_to_osmesa, gpu_service_logging, disable_gl_drawing));
+      impl, fallback_to_software_gl, gpu_service_logging, disable_gl_drawing));
 }
 
 // static
 void GLSurfaceTestSupport::InitializeOneOffImplementation(
     GLImplementation impl,
-    bool fallback_to_osmesa) {
+    bool fallback_to_software_gl) {
   DCHECK(!base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kUseGL))
       << "kUseGL has not effect in tests";
 
@@ -82,7 +82,7 @@
   bool disable_gl_drawing = false;
 
   CHECK(init::InitializeGLOneOffImplementation(
-      impl, fallback_to_osmesa, gpu_service_logging, disable_gl_drawing));
+      impl, fallback_to_software_gl, gpu_service_logging, disable_gl_drawing));
 }
 
 // static
diff --git a/ui/views/controls/native/native_view_host_aura_unittest.cc b/ui/views/controls/native/native_view_host_aura_unittest.cc
index a0833e02..e263d29 100644
--- a/ui/views/controls/native/native_view_host_aura_unittest.cc
+++ b/ui/views/controls/native/native_view_host_aura_unittest.cc
@@ -105,6 +105,12 @@
                                     host()));
   }
 
+  // test::NativeViewHostTestBase:
+  void TearDown() override {
+    child_.reset();
+    test::NativeViewHostTestBase::TearDown();
+  }
+
  private:
   std::unique_ptr<Widget> child_;
 
diff --git a/ui/views/mus/pointer_watcher_event_router.cc b/ui/views/mus/pointer_watcher_event_router.cc
index 3daf94c0c..e73a13a 100644
--- a/ui/views/mus/pointer_watcher_event_router.cc
+++ b/ui/views/mus/pointer_watcher_event_router.cc
@@ -163,7 +163,7 @@
     observer.OnPointerEventObserved(event, location_in_screen, nullptr);
 }
 
-void PointerWatcherEventRouter::OnDidDestroyClient(
+void PointerWatcherEventRouter::OnWillDestroyClient(
     aura::WindowTreeClient* client) {
   // We expect that all observers have been removed by this time.
   DCHECK_EQ(event_types_, EventTypes::NONE);
diff --git a/ui/views/mus/pointer_watcher_event_router.h b/ui/views/mus/pointer_watcher_event_router.h
index 4298b78..2487fbc8e 100644
--- a/ui/views/mus/pointer_watcher_event_router.h
+++ b/ui/views/mus/pointer_watcher_event_router.h
@@ -71,7 +71,7 @@
   EventTypes DetermineEventTypes();
 
   // aura::WindowTreeClientObserver:
-  void OnDidDestroyClient(aura::WindowTreeClient* client) override;
+  void OnWillDestroyClient(aura::WindowTreeClient* client) override;
 
   // aura::client::CaptureClientObserver:
   void OnCaptureChanged(aura::Window* lost_capture,
diff --git a/ui/views/mus/views_mus_test_suite.cc b/ui/views/mus/views_mus_test_suite.cc
index 57776440..0812025f 100644
--- a/ui/views/mus/views_mus_test_suite.cc
+++ b/ui/views/mus/views_mus_test_suite.cc
@@ -223,7 +223,7 @@
   // setup for tests (e.g. to unlock the screen in the window manager).
   EnsureCommandLineSwitch(ui::switches::kUseTestConfig);
 
-  EnsureCommandLineSwitch(switches::kOverrideUseGLWithOSMesaForTests);
+  EnsureCommandLineSwitch(switches::kOverrideUseSoftwareGLForTests);
 
   ViewsTestSuite::Initialize();
   service_manager_connections_ = base::MakeUnique<ServiceManagerConnection>();