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(), ¶ms)); - 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(), ¶ms)); - 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, ®ister_contents); + BlobStorageMsg_RegisterBlob::ReadSendParam(register_message, + ®ister_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>();